0

Promise All

 


Pada materi sebelumnya kita belajar bagaimana promise dapat menangani situasi di mana terdapat asynchronous process yang saling membutuhkan untuk melaksanakan tugasnya. Lalu bagaimana jika kita ingin menjalankan banyak promise sekaligus tanpa memedulikan urutan? Bukankah concurrency memungkinkan kita melakukan banyak proses bersamaan agar lebih efisien?

Ketika pergi ke sebuah kedai kopi bersama rekan kerja, kita biasanya memesan kopi secara bersamaan. Meskipun kopi yang kita pesan berbeda, tak jarang pelayanan mengantarkan pesanan bersamaan. Nah, pada kasus inilah pelayan menggunakan teknik Promise.all().

Method Promise.all() dapat menerima banyak promise dalam bentuk array pada parameternya. Kemudian method tersebut akan mengembalikan nilai seluruh hasil dari promise dalam bentuk array.

Contohnya seperti berikut.

  1. const promises = [firstPromise(), secondPromise(), thirdPromise()];
  2.  
  3. Promise.all(promises)
  4.   .then(resolvedValue => {
  5.     console.log(resolvedValue);
  6.   });
  7.  
  8. /* output
  9. [ 'first promise', 'second promise', 'third promise' ]
  10. */

Pada kasus mesin kopi, kita bisa menambahkan proses untuk memanaskan air dan menggiling biji kopi.

  1. const boilWater = () => {
  2.   return new Promise((resolve, reject) => {
  3.     console.log('Memanaskan air...');
  4.     setTimeout(() => {
  5.       resolve('Air panas sudah siap!');
  6.     }, 2000);
  7.   });
  8. };
  9.  
  10. const grindCoffeeBeans = () => {
  11.   return new Promise((resolve, reject) => {
  12.     console.log('Menggiling biji kopi...');
  13.     setTimeout(() => {
  14.       resolve('Bubuk kopi sudah siap!');
  15.     }, 1000);
  16.   });
  17. };

Keduanya dapat berjalan bersamaan. Kita akan memanfaatkan Promise.all() untuk menjalankan kedua fungsi di atas sebelum fungsi brewCoffee(). Ubah kode fungsi makeEspresso() menjadi seperti berikut.

  1. function makeEspresso() {
  2.   checkAvailability()
  3.     .then((value) => {
  4.       console.log(value);
  5.       return checkStock();
  6.     })
  7.     .then((value) => {
  8. console.log(value);
  9. const promises = [boilWater(), grindCoffeeBeans()];
  10.  
  11.       return Promise.all(promises);
  12.     })
  13.     .then((value) => {
  14.       console.log(value)
  15.       return brewCoffee();
  16.     })
  17.     .then((value) => {
  18.       console.log(value);
  19.     state.isCoffeeMachineBusy = false;
  20.     })
  21.     .catch((rejectedReason) => {
  22.       console.log(rejectedReason);
  23.       state.isCoffeeMachineBusy = false;
  24.     });
  25. }
  26.  
  27. makeEspresso();
  28.  
  29. /* output
  30. Mesin kopi siap digunakan.
  31. Stok cukup. Bisa membuat kopi.
  32. Memanaskan air...
  33. Menggiling biji kopi...
  34. [ 'Air panas sudah siap!', 'Bubuk kopi sudah siap!' ]
  35. Membuatkan kopi Anda...
  36. Kopi sudah siap!
  37. */

Ketika kode di atas dieksekusi, kita perlu menunggu dua (2) detik untuk proses boilWater dan grindCoffeeBeans (durasi terlama dari promise yang dijalankan dari Promise.all()). Ini menunjukkan bahwa semua promise di dalam Promise.all() berjalan bersamaan dan menunggu sampai semua proses di dalamnya selesai dijalankan.

Yang perlu kita perhatikan, urutan nilai yang dihasilkan oleh method ini sesuai dengan promise yang kita tentukan pada parameternya.

  1. /* output
  2. [ 'Air panas sudah siap!', 'Bubuk kopi sudah siap!' ]
  3. */

Nilai dari boilWater akan tetap berada di posisi pertama, meskipun proses ini membutuhkan waktu lebih lama.

Posting Komentar
Theme
Share
Additional JS