SlideShare a Scribd company logo
1 of 68
Download to read offline
Bagaimana proses asynchronous pada javascript
bekerja
31 Oktober 2020
Understanding asynchronous
process on website
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
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/)
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
01. Basic syntax HTML & javascript
02. Website development
03. API development
04. Third-party library (jQuery, axios)
Apa yang tidak akan kita bahas?
Apa itu asynchronous?
Sebelum ke sana, mari kita cari tahu apa itu
synchronous
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’);
Contoh
synchronous
Main
Thread
Pernyataan 1
Program dijalankan pada
thread utama.
Secara default, program
javascript akan dieksekusi
secara berurutan.
Pernyataan 2
Pernyataan 3
Pernyataan 4
Main
Thread
Contoh
synchronous
Main
Thread
Pernyataan 1
Pernyataan 2
Pernyataan 3
Pernyataan 4
Main
Thread
Database
Butuh waktu
Contoh
synchronous
Main
Thread
Pernyataan 1
Pernyataan 2
Pernyataan 3
Pernyataan 4
Main
Thread
Database
Butuh waktu
Files
Butuh waktu
Async to the rescue!
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!”
Contoh
asynchronous
Main
Thread
Pernyataan 1
Pernyataan 2
Pernyataan 3
Pernyataan 4
Database
Butuh waktu
Callback
Start now, finish later
Async Process
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.
HTTP request
Bagaimana cara membuat request ke jaringan
Penerapan HTTP
Request
● HTTP request digunakan untuk mengambil data dari
server lain.
● Kita membuat request melalui API endpoints.
API endpoints
Contoh: https://api.bukalapak.com/products/3m3opp7
Product detail page
some other
server
HTTP request
Response (data)
Fake API endpoint
Kita akan menggunakan
https://jsonplaceholder.typicode.com untuk melakukan
HTTP request
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
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.
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
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.
Status codes
Additional Notes Here
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
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
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
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();
Callback function
Additional Notes Here
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.
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.
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.
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.
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);
});
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');
Using JSON data
Memahami data berformat JSON
● 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"
}
● 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"
}
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
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
Callback hell
Bagaimana cara kita menangani lebih dari satu HTTP
request?
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
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
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);
});
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
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
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
Melakukan request untuk tiga
endpoint bersifat chaining request
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
const endpointThree = 'https://jsonplaceholder.typicode.com/posts';
getTodo(endpointOne, function(err, data) {
console.log(data);
getTodo(endpointTwo, function(err, data) {
console.log(data);
getTodo(endpointThree, function(err, data) {
console.log(data);
});
});
});
● https://jsonplaceholder.typicode.com/todos
● https://jsonplaceholder.typicode.com/users
● https://jsonplaceholder.typicode.com/posts
Melakukan request untuk banyak
endpoint bersifat chaining request
...
...
...
getTodo(endpointOne, function(err, data) {
console.log(data);
getTodo(endpointTwo, function(err, data) {
console.log(data);
getTodo(endpointThree, function(err, data) {
console.log(data);
getTodo(endpointFour, function(err, data) {
console.log(data);
getTodo(endpointFive, function(err, data) {
console.log(data);
getTodo(endpointSix, function(err, data) {
console.log(data);
});
});
});
});
});
});
CALLBACK HELL!!!
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!
Promise
Mengapa kita butuh mengimplementasi promise?
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);
}
});
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);
});
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);
});
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.
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.
Chaining promise
Menghindari callback hell menggunakan promise
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.
Kode chaining request
sebelumnya
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
const endpointThree = 'https://jsonplaceholder.typicode.com/posts';
getTodo(endpointOne, function(err, data) {
console.log(data);
getTodo(endpointTwo, function(err, data) {
console.log(data);
getTodo(endpointThree, function(err, data) {
console.log(data);
});
});
});
Kode chaining request
setelah menggunakan
promise
...
...
...
const endpointOne = 'https://jsonplaceholder.typicode.com/todos';
const endpointTwo = 'https://jsonplaceholder.typicode.com/users';
const endpointThree = 'https://jsonplaceholder.typicode.com/posts';
getTodo(endpointOne)
.then(function(data) {
console.log('Promise 1 berhasil: ', data);
return getTodo(endpointTwo);
})
.then(function(data) {
console.log('Promise 2 berhasil: ', data);
return getTodo(endpointThree);
})
.then(function(data) {
console.log('Promise 3 berhasil: ', data);
})
.catch(function(error) {
console.log('Promise gagal: ', error);
});
Fetch API
Fitur alternatif ketika melakukan HTTP request
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);
});
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
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);
});
Async & await
Menulis sintaks asynchronous dengan gaya
synchronous
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();
Error handling di async
& await
Menggunakan blok try - catch
const getTodo = async function() {
try {
const response = await fetch('https://jsdonplaceholder.typicode.com/todos');
const data = await response.json();
console.log(data);
}
catch (e) {
console.log(e);
}
};
getTodo();
Chaining request
menggunakan async &
await
const getTodo = async function() {
try {
const responseOne = await fetch('https://jsonplaceholder.typicode.com/todos');
const dataOne = await responseOne.json();
const responseTwo = await fetch('https://jsonplaceholder.typicode.com/users');
const dataTwo = await responseTwo.json();
const responseThree = await fetch('https://jsonplaceholder.typicode.com/posts');
const dataThree = await responseThree.json();
console.log(dataOne, dataTwo, dataThree);
}
catch (e) {
console.log(e);
}
};
getTodo();
Menjadi lebih rapi dan mudah dibaca
bukan?
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
Let’s
Discussion
Together!
Please send your further question to
rizal.asrul@bukalapak.com
Or ping me in telegram
@rizalasrul

More Related Content

Similar to Understanding asynchronous process on website

Octav android mysql
Octav android mysqlOctav android mysql
Octav android mysqlrikysp
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15alqod
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15alqod
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15alqod
 
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdf
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdfhusni-sister2017_05c_pemrograman_socket_java_server_detail.pdf
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdfLiberitoSantos
 
Jeni Web Programming Bab 3 Advanced Servlets
Jeni Web Programming Bab 3 Advanced ServletsJeni Web Programming Bab 3 Advanced Servlets
Jeni Web Programming Bab 3 Advanced ServletsIndividual Consultants
 
web_server-side-scripting2.pdf
web_server-side-scripting2.pdfweb_server-side-scripting2.pdf
web_server-side-scripting2.pdfAhmadKhanifFikri
 
Menyimpan Data Ke Database Dengan Ajax Dan PHP
Menyimpan Data Ke Database Dengan Ajax Dan PHPMenyimpan Data Ke Database Dengan Ajax Dan PHP
Menyimpan Data Ke Database Dengan Ajax Dan PHPEllyx Christian
 
Pemrograman Bergerak Pertemuan 10.docx
Pemrograman Bergerak Pertemuan 10.docxPemrograman Bergerak Pertemuan 10.docx
Pemrograman Bergerak Pertemuan 10.docxHendroGunawan8
 
Pemrograman Bergerak Pertemuan 9.pdf
Pemrograman Bergerak Pertemuan 9.pdfPemrograman Bergerak Pertemuan 9.pdf
Pemrograman Bergerak Pertemuan 9.pdfHendroGunawan8
 
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)Walid Umar
 
JavaScript Standard Library.pdf
JavaScript Standard Library.pdfJavaScript Standard Library.pdf
JavaScript Standard Library.pdfPutri Sari
 
Modul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoModul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoYatno Sudar
 
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLite
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLiteCara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLite
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLitecreatorb dev
 
Mulai melangkah dengan Node.js
Mulai melangkah dengan Node.jsMulai melangkah dengan Node.js
Mulai melangkah dengan Node.jsMohammad Anwari
 
Membuat aplikasi chat menggunakan java
Membuat aplikasi chat menggunakan javaMembuat aplikasi chat menggunakan java
Membuat aplikasi chat menggunakan javaEko Kurniawan Khannedy
 

Similar to Understanding asynchronous process on website (20)

Octav android mysql
Octav android mysqlOctav android mysql
Octav android mysql
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15
 
Kelompok 15
Kelompok 15Kelompok 15
Kelompok 15
 
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdf
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdfhusni-sister2017_05c_pemrograman_socket_java_server_detail.pdf
husni-sister2017_05c_pemrograman_socket_java_server_detail.pdf
 
Jeni Web Programming Bab 3 Advanced Servlets
Jeni Web Programming Bab 3 Advanced ServletsJeni Web Programming Bab 3 Advanced Servlets
Jeni Web Programming Bab 3 Advanced Servlets
 
web_server-side-scripting2.pdf
web_server-side-scripting2.pdfweb_server-side-scripting2.pdf
web_server-side-scripting2.pdf
 
Pengenalan Teknologi ajax
Pengenalan Teknologi ajaxPengenalan Teknologi ajax
Pengenalan Teknologi ajax
 
Menyimpan Data Ke Database Dengan Ajax Dan PHP
Menyimpan Data Ke Database Dengan Ajax Dan PHPMenyimpan Data Ke Database Dengan Ajax Dan PHP
Menyimpan Data Ke Database Dengan Ajax Dan PHP
 
Pemrograman Bergerak Pertemuan 10.docx
Pemrograman Bergerak Pertemuan 10.docxPemrograman Bergerak Pertemuan 10.docx
Pemrograman Bergerak Pertemuan 10.docx
 
Tugas 3
Tugas 3Tugas 3
Tugas 3
 
Pemrograman Bergerak Pertemuan 9.pdf
Pemrograman Bergerak Pertemuan 9.pdfPemrograman Bergerak Pertemuan 9.pdf
Pemrograman Bergerak Pertemuan 9.pdf
 
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)
PENYELESAIAN UKK FIX TKJ SMK NEGERI 4 GORONTALO (2019)
 
JavaScript Standard Library.pdf
JavaScript Standard Library.pdfJavaScript Standard Library.pdf
JavaScript Standard Library.pdf
 
Modul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoModul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android Sudaryatno
 
SESI 3 FE.pptx
SESI 3 FE.pptxSESI 3 FE.pptx
SESI 3 FE.pptx
 
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLite
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLiteCara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLite
Cara Membuat Aplikasi Android Resep Masakan Sederhana Android-SQLite
 
Mulai melangkah dengan Node.js
Mulai melangkah dengan Node.jsMulai melangkah dengan Node.js
Mulai melangkah dengan Node.js
 
Jsp
JspJsp
Jsp
 
Membuat aplikasi chat menggunakan java
Membuat aplikasi chat menggunakan javaMembuat aplikasi chat menggunakan java
Membuat aplikasi chat menggunakan java
 

Understanding asynchronous process on website

  • 1. Bagaimana proses asynchronous pada javascript bekerja 31 Oktober 2020 Understanding asynchronous process on website
  • 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?
  • 6. Apa itu asynchronous? Sebelum ke sana, mari kita cari tahu apa itu synchronous
  • 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’);
  • 8. Contoh synchronous Main Thread Pernyataan 1 Program dijalankan pada thread utama. Secara default, program javascript akan dieksekusi secara berurutan. Pernyataan 2 Pernyataan 3 Pernyataan 4 Main Thread
  • 9. Contoh synchronous Main Thread Pernyataan 1 Pernyataan 2 Pernyataan 3 Pernyataan 4 Main Thread Database Butuh waktu
  • 10. Contoh synchronous Main Thread Pernyataan 1 Pernyataan 2 Pernyataan 3 Pernyataan 4 Main Thread Database Butuh waktu Files Butuh waktu Async to the rescue!
  • 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!”
  • 12. Contoh asynchronous Main Thread Pernyataan 1 Pernyataan 2 Pernyataan 3 Pernyataan 4 Database Butuh waktu Callback Start now, finish later Async Process
  • 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.
  • 14. HTTP request Bagaimana cara membuat request ke jaringan
  • 15. Penerapan HTTP Request ● HTTP request digunakan untuk mengambil data dari server lain. ● Kita membuat request melalui API endpoints.
  • 16. API endpoints Contoh: https://api.bukalapak.com/products/3m3opp7 Product detail page some other server HTTP request Response (data)
  • 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');
  • 34. Using JSON data Memahami data berformat JSON
  • 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
  • 39. Callback hell Bagaimana cara kita menangani lebih dari satu HTTP request?
  • 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
  • 46. Melakukan request untuk tiga endpoint bersifat chaining request ... ... ... const endpointOne = 'https://jsonplaceholder.typicode.com/todos'; const endpointTwo = 'https://jsonplaceholder.typicode.com/users'; const endpointThree = 'https://jsonplaceholder.typicode.com/posts'; getTodo(endpointOne, function(err, data) { console.log(data); getTodo(endpointTwo, function(err, data) { console.log(data); getTodo(endpointThree, function(err, data) { console.log(data); }); }); }); ● https://jsonplaceholder.typicode.com/todos ● https://jsonplaceholder.typicode.com/users ● https://jsonplaceholder.typicode.com/posts
  • 47. Melakukan request untuk banyak endpoint bersifat chaining request ... ... ... getTodo(endpointOne, function(err, data) { console.log(data); getTodo(endpointTwo, function(err, data) { console.log(data); getTodo(endpointThree, function(err, data) { console.log(data); getTodo(endpointFour, function(err, data) { console.log(data); getTodo(endpointFive, function(err, data) { console.log(data); getTodo(endpointSix, function(err, data) { console.log(data); }); }); }); }); }); }); CALLBACK HELL!!!
  • 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!
  • 49. Promise Mengapa kita butuh mengimplementasi promise?
  • 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.
  • 55. Chaining promise Menghindari callback hell menggunakan promise
  • 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.
  • 57. Kode chaining request sebelumnya ... ... ... const endpointOne = 'https://jsonplaceholder.typicode.com/todos'; const endpointTwo = 'https://jsonplaceholder.typicode.com/users'; const endpointThree = 'https://jsonplaceholder.typicode.com/posts'; getTodo(endpointOne, function(err, data) { console.log(data); getTodo(endpointTwo, function(err, data) { console.log(data); getTodo(endpointThree, function(err, data) { console.log(data); }); }); });
  • 58. Kode chaining request setelah menggunakan promise ... ... ... const endpointOne = 'https://jsonplaceholder.typicode.com/todos'; const endpointTwo = 'https://jsonplaceholder.typicode.com/users'; const endpointThree = 'https://jsonplaceholder.typicode.com/posts'; getTodo(endpointOne) .then(function(data) { console.log('Promise 1 berhasil: ', data); return getTodo(endpointTwo); }) .then(function(data) { console.log('Promise 2 berhasil: ', data); return getTodo(endpointThree); }) .then(function(data) { console.log('Promise 3 berhasil: ', data); }) .catch(function(error) { console.log('Promise gagal: ', error); });
  • 59. Fetch API Fitur alternatif ketika melakukan HTTP request
  • 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); });
  • 63. Async & await Menulis sintaks asynchronous dengan gaya synchronous
  • 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();
  • 65. Error handling di async & await Menggunakan blok try - catch const getTodo = async function() { try { const response = await fetch('https://jsdonplaceholder.typicode.com/todos'); const data = await response.json(); console.log(data); } catch (e) { console.log(e); } }; getTodo();
  • 66. Chaining request menggunakan async & await const getTodo = async function() { try { const responseOne = await fetch('https://jsonplaceholder.typicode.com/todos'); const dataOne = await responseOne.json(); const responseTwo = await fetch('https://jsonplaceholder.typicode.com/users'); const dataTwo = await responseTwo.json(); const responseThree = await fetch('https://jsonplaceholder.typicode.com/posts'); const dataThree = await responseThree.json(); console.log(dataOne, dataTwo, dataThree); } catch (e) { console.log(e); } }; getTodo(); Menjadi lebih rapi dan mudah dibaca bukan?
  • 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
  • 68. Let’s Discussion Together! Please send your further question to rizal.asrul@bukalapak.com Or ping me in telegram @rizalasrul