Asynchronous
Asynchronous adalah suatu proses yang dikerjakan secara bersamaan. Di javascript, umumnya suatu kode dikerjakana secara berurutan (synchronous), namun ada banyak yang dikerjakan secara asynchronous sepert event dan Ajax.
Keuntungan penggunaan aynchronous adalah proses menjadi lebih cepat, karena tidak harus menunggu suatu blok kode selessai dikerjakan. Jika javascript menemukan suatu proses yang lama, maka sambil menunggu proses itu selesai, javascript akan mengeksekusi kode selanjutnya.
Kelemahan asynchronous adalah adanya kemungkinan race condition jika ada suatu blok kode yang membutuhkan hasil dari proses lain, tenryata dieksekusi ketika proses lain tersebut belum memberikan hasil. Besar kemungkinan ketika bliok kode tersebut, datanya masih kosong.
Untuk mengatasi hal tersebut, dalam pemrograman asynchronous dioptimalkan penggunaan callback, async/await dan promise.
Callback
Kita telah mempelajari callback sebelumnya. Dalam proses asynchronous, penggunaan callback sangat masif. Sebagai contoh, kita akan menggunakan kode pemanggilan AJAX dengan teknik callback. Namun agar pemahaman lebih utuh, awalnya kita aklan mebuat contoh kode tanpa callback.
Pada kode di atas, kita memanggil list(); kemudian memangil displayUser();. fungsi list() berguna untuk mengupdate variabel users dengan data hasil call ajax. Sementara fungsi displayUser() berguna untuk menampilkan data list user ke dalam tabel.
Harapannya akan tampil table list user dengan sleuruh data yang ada. Namun karena list() membutuhkan waktu lebih lama, maka displayUser hanya menampilkan header table saja, karena ketika fungsi displayUser() dijalankan, saat itu variabel users masih kosong.
Ide dasarnya adalah bagaimana caranya agar fungsi displayUser() dipanggil setelah fungsi list() selesai dieksekusi. Salah satu teknik yang digunakan adalah dengan callback, dimana funhsi displayUser() akan dipanggil tepat setelah variabel users diupdate.
Kita akan perbaiki kode di atas dengan teknik callback. fungsi displayUser akan dilempar sebagai parameter fungsi list(), dan dipanggil tepat setelah variabel users diupdate.
Promise
Promise adalah suatu teknik handling asynchronous dengan memberi janji bahwa suatu kode akan dieksekusi dan hasilnya (apakah akan berhasil atau tidak) akan diberi tahu kemudian. Cara untuk mengetahui hasil suatu promise adalah dengan mendengarkan/mengikuti/listen promise.
Dengan teknik ini, akan ad dua buah kode, yaiti kode producer (yang memberi janji), dan kode konsumer (yang mendengarkan hasil).
Kode producer mengembalikan suatiu promise dengan dua callback, yaitu bila sukses akan menjalankan callback resolve() sementara jika gagal akan mengembalikan callback reject(). Format producer promise adalah sebagai berikut :
Sementara kode untuk konsumer adalah dengan kata kunci then untuk handling jika hasilnya adalah sukses, dan catch jika hasilnya adalah error.
Kita bisa melengkapi konsumer dengan kata kunci finally yang akan selalu dieksekusi baik sukses maupun error.
Sebagi contoh, kita akan mengubah penggunaan callback pada list user dengan promise. Karena pada contoh AJAX sebelumnya kita tidak menghandle error, saya akan mengenalkan event baru di xmlHttprequest yaitu onreadystatechange untuk menghandle event jika ajax sudah selesai. Juga ada suatu properti status untuk mengetahui status code dari response ajax.
Promise.all()
Ada kalanya kode yang dijanjikan bukan hanya satu, namun bisa banyak kode yang dijanjikan. Untuk konsumer, bisa dengan memanfaatkan fitur Promise.all() untuk melisten seluruh kode yang dijanjikan.
async/await
Penulisan sintaks promise agak merepotkan, untunglah javascript menawarkan solusi async/await. kata kunci async yang diletakkan sebelum function membuat fungsi tersebut akan mengembalikan promise.
Sementara sintaks await digunakan untuk menunggu promise selesai dieksekusi. Yang perlu diperhatikan adalah, async-await ini merupakan sintaks ES modern yang hanya bekerja dalam suatu module. Pastikan ketika menulis script, tambahkan informasi type=module.
Dengan mengetahui konsep async dan await, kita bisa mengubah file list-user menjadi kode berikut:
Last updated