2. Rizal A. Pambudi
Join date
Virtual Product
20 Jan 2018
ABOUT ME
I’m software engineer who focuses on the frontend screen. I’m currently part of
Bukalapak engineering team. Find me on internet with @rizalasrul. I also have a
website in rizalasrul.com.
BEFORE BUKALAPAK
PT. Ultrajaya Milk Industry - 2017
IT Developer
Position Frontend Engineer
Graduated from PENS - 2016
Bachelor of Applied Science.
D4 Teknik Informatika - PENS
Undergraduate Student
PT. Ultrajaya Milk Industry - 2016
IT Support
PT. Reendoo Profita Nusantara
Web developer
Division
3. Perangkat lunak yang dibutuhkan
01. Code editor (Sublime, VisualStudio Code, Notepad++)
02. Browser (Chrome, Firefox, Safari)
03. Web server (XAMPP, NPM live-server) *
04. Chrome dev tools
05. JS online editor (https://js.do/)
4. Apa yang akan
kita bahas?
Async javascript
“
“
Pengenalan01
02 HTTP Request
03 Status Codes
04 Callback Function
05 Using JSON Data
06 Callback Hell
07 Promises
08 Chaining Promise
09 Fetch API
10 Async & Await
5. 01. Basic syntax HTML & javascript
02. Website development
03. API development
04. Third-party library (jQuery, axios)
Apa yang tidak akan kita bahas?
7. Apa itu synchronous?
● Program dalam javascript secara default akan dieksekusi baris per baris.
● Secara default, proses di javascript akan dieksekusi secara synchronous.
● Proses synchronous juga bisa disebut blocking, karena harus menunggu tiap proses
selesai, baru proses selanjutnya berjalan.
console.log(‘Pernyataan 1’);
console.log(‘Pernyataan 2’);
console.log(‘Pernyataan 3’);
11. Apa itu
asynchronous?
● Walaupun secara default proses javascript adalah
synchronous, namun kita bisa membuatnya menjadi
asynchronous.
● Pada proses asynchronous, javascript tidak akan
menunggu proses sebelumnya selesai.
● Proses asynchronous juga biasa disebut non-blocking.
“Start now, and finish it later!”
13. Contoh kode
asynchronous
console.log(‘Pernyataan 1’);
setTimeout(function() {
console.log(‘Callback function berjalan’);
}, 2000);
console.log(‘Pernyataan 2’);
console.log(‘Pernyataan 3’);
console.log(‘Pernyataan 4’);
setTimeout(function, milliseconds)
Memanggil fungsi atau mengevaluasi ekspresi setelah sejumlah milidetik.
17. Fake API endpoint
Kita akan menggunakan
https://jsonplaceholder.typicode.com untuk melakukan
HTTP request
18. Contoh kode HTTP
request
const request = new XMLHttpRequest();
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
XMLHttpRequest
Built-in class pada javascript yang digunakan untuk melakukan HTTP request.
https://jsonplaceholder.typicode.com/todos
19. Melacak response data
dari HTTP request
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
console.log(request, request.readyState);
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
addEventListener
Menambahkan sebuah listener kepada event yang tersedia.
https://jsonplaceholder.typicode.com/todos
Melacak progres dari HTTP request
menggunakan event listener dan spesifik event
yang bernama readystatechange.
20. Value State Description
0 UNSENT Client (website) baru saja terbuat. Fungsi open() belum dijalankan.
1 OPENED Fungsi open() baru saja dijalankan.
2 HEADERS_RECEIVED Fungsi send() baru saja dijalankan.
3 LOADING Sedang proses mengunduh data dari server.
4 DONE Client telah menerima data dari server. Proses selesai.
XMLHttpRequest.readyState
Kode status pada HTTP request
21. Menangkap response
ketika state DONE
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4) {
console.log(request.responseText);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
https://jsonplaceholder.typicode.com/todos
Menampilkan response data ketika state
bernilai DONE.
23. Mari kita cermati kode
di tahap sebelumnya
● responseText hanya ditampilkan
ketika proses HTTP request
selesai, yang digambarkan
dengan readyState bernilai 4.
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', () => {
if (request.readyState === 4) {
console.log(request.responseText);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', () => {
if (request.readyState === 4) {
console.log(request.responseText);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todosssss');
request.send();
● Bagaimana jika API endpoint
yang kita akses tidak valid?
Sengaja dibikin salah supaya kita
tahu bagaimana behaviournya
24. Menangkap response ketika
state DONE dan status code
bernilai 200
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
console.log(request.responseText);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
Menambah kondisi ketika
status code bernilai 200
25. Code Description
1xx Response informasi.
2xx Response berhasil.
3xx Redirect.
4xx Error terjadi di sisi client.
5xx Error terjadi di sisi server.
HTTP response status codes
Untuk lebih jelas,
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
26. Menampilkan pesan error
ketika request bermasalah
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
console.log(request.responseText);
} else if (request.readyState === 4) {
console.log(‘Terjadi error ketika request’);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
28. Apa itu callback?
● Callback merupakan mekanisme untuk memanggil kembali kode yang ada di
program dari proses async.
● Callback biasanya dibuat dalam bentuk function.
● Dengan menggunakan callback function, program bisa menerima informasi yang
dibutuhkan ketika proses async berhasil dieksekusi.
console.log(‘Pernyataan 1’);
setTimeout(function() {
console.log(‘Callback function berjalan’);
}, 2000);
console.log(‘Pernyataan 2’);
console.log(‘Pernyataan 3’);
console.log(‘Pernyataan 4’);
Contoh callback function.
29. Cara membuat callback
function sederhana
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
console.log(request.responseText);
} else if (request.readyState === 4) {
console.log(‘Terjadi error ketika request’);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
● Preview kode sebelumnya.
30. Cara membuat callback
function sederhana
const getTodo = function() {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
console.log(request.responseText);
} else if (request.readyState === 4) {
console.log('Terjadi error ketika request');
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo();
● Preview kode sebelumnya
● Bungkus kode dengan function.
31. Cara membuat callback
function sederhana
const getTodo = function(callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
callback();
} else if (request.readyState === 4) {
callback();
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo(function() {
console.log('Fungsi callback dijalankan');
});
● Preview kode sebelumnya
● Bungkus kode dengan function.
● Menambahkan parameter bertipe function yang akan dijalankan ketika request
berhasil atau gagal.
32. Membuat pembeda pada callback function
ketika request berhasil atau gagal
const getTodo = function(callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
callback(undefined, request.responseText);
} else if (request.readyState === 4) {
callback('HTTP request error', undefined);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo(function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
33. Fungsi getTodo tidak
blocking kode lain
...
...
...
console.log('Pernyataan 1');
console.log('Pernyataan 2');
getTodo(function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
console.log(‘Pernyataan 3');
console.log('Pernyataan 4');
35. ● JSON singkatan dari Javascript Object Notation.
● JSON adalah tipe data object pada Javascript.
● https://www.json.org.
Apa itu JSON?
{
"first_name": "Rizal",
"last_name": "Asrul Pambudi",
“age”: 26,
"address": {
"city": "Depok",
"country": "Indonesia"
},
“hobbies”: [“running”, “archery”, “flying”],
"url": "https://rizalasrul.com"
}
36. ● JSON sangat populer digunakan dalam pembuatan RESTful API saat ini,
● Data JSON sangat mudah dibuat dan dimengerti oleh manusia.
● Tidak hanya di javascript, JSON mudah dibuat di hampir semua bahasa
pemrograman.
● JSON sangat ringan.
Mengapa menggunakan
JSON?
{
"first_name": "Rizal",
"last_name": "Asrul Pambudi",
“age”: 26,
"address": {
"city": "Depok",
"country": "Indonesia"
},
“hobbies”: [“running”, “archery”, “flying”],
"url": "https://rizalasrul.com"
}
37. Mari kita cermati kode di tahap
sebelumnya
const getTodo = function(callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
callback(undefined, request.responseText);
} else if (request.readyState === 4) {
callback('HTTP request error', undefined);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo(function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
JSON.parse
Mengubah string JSON menjadi data object javascript
38. Mari kita cermati kode di tahap
sebelumnya
const getTodo = function(callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
const data = JSON.parse(request.responseText);
callback(undefined, data);
} else if (request.readyState === 4) {
callback('HTTP request error', undefined);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo(function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
JSON.parse
Mengubah string JSON menjadi data object javascript
40. Kode kita hanya bisa
menangani satu HTTP
request
● Di dunia nyata, bisa jadi kita
membutuhkan lebih dari satu
HTTP request.
● Bisa jadi antar request saling
membutuhkan satu sama lain
(chaining request).
● Oleh karena itu kita perlu
memperbaiki kode kita saat ini.
const getTodo = function(callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
const data = JSON.parse(request.responseText);
callback(undefined, data);
} else if (request.readyState === 4) {
callback('HTTP request error', undefined);
}
});
request.open('GET', 'https://jsonplaceholder.typicode.com/todos');
request.send();
};
getTodo(function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
API endpoint ini hardcoded
41. Menambahkan parameter untuk
melewatkan API endpoint
const getTodo = function(endpoint, callback) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
const data = JSON.parse(request.responseText);
callback(undefined, data);
} else if (request.readyState === 4) {
callback('HTTP request error', undefined);
}
});
request.open('GET', endpoint);
request.send();
};
const endpoint = 'https://jsonplaceholder.typicode.com/todos';
getTodo(endpoint, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
Menjadikan API endpoint sebagai parameter
parameter
parameter
42. Melakukan request
untuk satu endpoint
...
...
...
const endpoint = 'https://jsonplaceholder.typicode.com/todos';
getTodo(endpoint, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
43. Melakukan request untuk dua
endpoint
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
getTodo(endpointOne, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
getTodo(endpointTwo, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
● https://jsonplaceholder.typicode.com/todos
● https://jsonplaceholder.typicode.com/users
44. Melakukan request untuk dua
endpoint bersifat chaining request
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
getTodo(endpointOne, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
getTodo(endpointTwo, function(err, data) {
console.log('Fungsi callback dijalankan');
if (err) console.log(err);
else console.log(data);
});
● https://jsonplaceholder.typicode.com/todos
● https://jsonplaceholder.typicode.com/users
45. Melakukan request untuk dua
endpoint bersifat chaining request
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
getTodo(endpointOne, function(err, data) {
console.log(data);
getTodo(endpointTwo, function(err, data) {
console.log(data);
});
});
● https://jsonplaceholder.typicode.com/todos
● https://jsonplaceholder.typicode.com/users
48. Callback hell?
● Callback hell, atau callback yang bersarang,
adalah efek samping yang dihasilkan ketika
kita memiliki banyak callback function.
● Efek samping tersebut berupa indentasi
yang semakin dalam, sehingga
mengakibatkan kode kita tidak rapi.
● Kode yang tidak rapi akan menjadi sesuatu
yang susah dirawat.
Promise to the rescue!
50. Apa itu promise?
● Promise merupakan proxy untuk sebuah nilai di masa depan (future) yang belum
diketahui saat ini.
● Promise biasa digunakan sebagai proxy untuk proses asynchronous.
● Penggunaan promise cukup mudah, dan lebih mirip dengan kode synchronous.
const promise = new Promise(function(resolve, reject) {
if (success) {
resolve(value);
}
else {
reject(error);
}
});
51. Function dengan return
promise
● Fungsi getSomething akan dijalankan dengan keyword .then().
● Fungsi yang ada di dalam .then() akan dieksekusi ketika fungsi resolve pada promise
dijalankan, yang mana berarti request kita berhasil.
const getSomething = function() {
return new Promise(function(resolve, reject) {
resolve('Data berhasil');
});
};
getSomething()
.then(function(data) {
console.log(data);
});
52. Function dengan return
promise
● Fungsi getSomething akan dijalankan dengan keyword .then().
● Fungsi yang ada di dalam .then() akan dieksekusi ketika fungsi resolve pada promise
dijalankan, yang mana berarti request kita berhasil.
● Fungsi getSomething juga akan dijalankan dengan keyword .catch().
● Fungsi yang ada di dalam .catch() akan dieksekusi ketika fungsi reject pada promise
dijalankan, yang mana berarti request kita gagal.
const getSomething = function() {
return new Promise(function(resolve, reject) {
reject('Pesan error');
});
};
getSomething()
.catch(function(data) {
console.log(data);
});
53. Implementasi dengan
kode sebelumnya
const getTodo = function(endpoint) {
return new Promise(function(resolve, reject) {
const request = new XMLHttpRequest();
request.addEventListener('readystatechange', function() {
if (request.readyState === 4 && request.status === 200) {
const data = JSON.parse(request.responseText);
resolve(data);
} else if (request.readyState === 4) {
reject('HTTP request error');
}
});
request.open('GET', endpoint);
request.send();
});
};
1. Melakukan refactor terhadap function getTodo supaya mengembalikan nilai promise.
54. Implementasi dengan
kode sebelumnya
...
...
...
const endpoint = 'https://jsonplaceholder.typicode.com/todos';
getTodo(endpoint)
.then(function(data) {
console.log(data);
})
.catch(function(error) {
console.log(error);
});
1. Melakukan refactor terhadap function getTodo supaya mengembalikan nilai promise.
2. Mengubah pemanggilan function getTodo diikuti dengan .then dan .catch.
56. Chaining promise
Salah satu hal terbaik dari promise adalah kita bisa mengikatnya satu sama
lain. Hal itu menjadikan kode yang kita tulis menjadi lebih rapi.
60. Apa itu fetch API?
● Fetch API adalah fungsi alami terbaru dari javascript yang dapat kita gunakan untuk
HTTP request.
● Salah satu hal yang menarik dari fetch API adalah sudah mengimplementasi promise
secara otomatis.
● https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
fetch('https://jsonplaceholder.typicode.com/todos')
.then(function(response) {
console.log('Berhasil: ', response);
})
.catch(function(error) {
console.log('Gagal: ', error);
});
61. Parsing data berupa
object menggunakan
fetch
fetch('https://jsonplaceholder.typicode.com/todos')
.then(function(response) {
console.log('Berhasil: ', response);
return response.json();
})
.then(function(data) {
console.log('Data: ', data);
})
.catch(function(error) {
console.log('Gagal: ', error);
});
Parsing data menggunakan
method bawaan .json.
Hasil dari parsing akan ditampilkan
di blok .then di bawahnya
62. Chaining request
menggunakan fetch API
Menggunakan fetch API dapat
menghindari callback hell. Tetapi
apakah kode disamping bisa dibikin
lebih rapi lagi?
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
const endpointThree = 'https://jsonplaceholder.typicode.com/posts';
fetch(endpointOne)
.then(function(response) {
console.log('Berhasil: ', response);
return response.json();
})
.then(function(data) {
console.log('Data: ', data);
return fetch(endpointTwo);
})
.then(function(response) {
console.log('Berhasil: ', response);
return response.json();
})
.then(function(data) {
console.log('Data: ', data);
return fetch(endpointThree);
})
.then(function(response) {
console.log('Berhasil: ', response);
return response.json();
})
.then(function(data) {
console.log('Data: ', data);
})
.catch(function(error) {
console.log('Gagal: ', error);
});
64. Apa itu async & await?
● Fitur baru JS yang digunakan untuk mempermudah penulisan sintaks kode promise.
● Dengan menggunakan async & await, kita bisa menulis kode asynchronous dengan
gaya synchronous.
● Async menandakan bahwa function tersebut bersifat asynchronous dan
mengembalikan nilai promise.
● Await digunakan untuk mendapatkan nilai hasil dari function yang mengembalikan
promise.
const getTodo = async function() {
const response = await fetch('https://jsonplaceholder.typicode.com/todos');
const data = await response.json();
console.log(data);
};
getTodo();
67. Selanjutnya belajar apa?
01. Metode HTTP request lain (POST, PUT, PATCH)
02. Async library (axios, jQuery AJAX)
03. Web socket
04. Memperdalam tentang non-blocking