Await Berurutan vs Paralel dengan Promise.all
Sudah bisa pakai async/await? Sekarang pertanyaan berikutnya: kalau kamu perlu menjalankan tiga operasi async, haruskah menunggu satu per satu, atau jalankan semuanya sekaligus? Jawabannya bisa membuat kode kamu tiga...
Await Berurutan vs Paralel dengan Promise.all
Sudah bisa pakai async/await? Sekarang pertanyaan berikutnya: kalau kamu perlu menjalankan tiga operasi async, haruskah menunggu satu per satu, atau jalankan semuanya sekaligus? Jawabannya bisa membuat kode kamu tiga kali lebih cepat, atau justru bikin bug kalau dipilih salah. Di sinilah perbedaan berurutan dan paralel penting.
Kenapa topik ini ada
Operasi async seperti mengambil data API atau membaca file butuh waktu menunggu. Bayangkan kamu memesan tiga makanan di warung: kamu tidak perlu menunggu pesanan pertama datang dulu baru memesan yang kedua. Kamu bisa memesan semuanya sekaligus, lalu semuanya dimasak bersamaan. Itulah paralel. Tapi kalau pesanan keduamu bergantung pada hasil pesanan pertama (misalnya ambil detail user dulu, baru ambil daftar pesanannya), maka urutan menjadi wajib.
Berurutan: menunggu satu per satu
Ini cara paling umum dan paling mudah dibaca. Setiap await menahan eksekusi sampai promise selesai:
async function berurutan() {
const user = await ambilUser(1); // tunggu 1 detik
const produk = await ambilProduk(5); // tunggu 1 detik lagi
const ulasan = await ambilUlasan(5); // tunggu 1 detik lagi
console.log("Selesai:", user, produk, ulasan);
}
// Total waktu: sekitar 3 detikMasalahnya: kalau ketiga operasi ini tidak saling bergantung, kamu membuang waktu. Masing-masing 1 detik, total 3 detik, padahal bisa jalan bareng.
Paralel: Promise.all
Promise.all menerima array promise dan menjalankan semuanya sekaligus. Hasilnya array dengan urutan yang sama seperti input:
async function paralel() {
const [user, produk, ulasan] = await Promise.all([
ambilUser(1),
ambilProduk(5),
ambilUlasan(5),
]);
console.log("Selesai:", user, produk, ulasan);
}
// Total waktu: sekitar 1 detik (yang paling lambat)Perhatikan: promise-promise itu dibuat dulu (tanpa await), lalu await Promise.all(...) menunggu semuanya. Ini pola kuncinya. Hasilnya tetap urut sesuai array, bukan sesuai siapa yang selesai duluan.
Ukur sendiri bedanya
const tunggu = (ms, nama) =>
new Promise((resolve) => setTimeout(() => resolve(nama), ms));
console.time("berurutan");
await tunggu(1000, "A");
await tunggu(1000, "B");
await tunggu(1000, "C");
console.timeEnd("berurutan"); // sekitar 3000ms
console.time("paralel");
await Promise.all([
tunggu(1000, "A"),
tunggu(1000, "B"),
tunggu(1000, "C"),
]);
console.timeEnd("paralel"); // sekitar 1000msBuka console browser dan jalankan. Kamu akan melihat perbedaan nyatanya, bukan cuma teori.
Kapan berurutan itu WAJIB
Paralel bukan selalu jawaban. Kalau operasi kedua butuh hasil operasi pertama, kamu tidak punya pilihan:
async function profilLengkap(idUser) {
const user = await ambilUser(idUser); // butuh dulu
const pesanan = await ambilPesanan(user.id); // pakai hasil di atas
return { user, pesanan };
}Menjalankan ini paralel tidak mungkin, karena user.id belum ada sebelum await ambilUser selesai.
Jebakan umum
- Satu gagal, semua gagal.
Promise.allmenolak (reject) begitu ada satu promise yang gagal, dan promise lain yang belum selesai tetap jalan di background tapi hasilnya dibuang. Kalau kamu butuh hasil sebagian, pakaiPromise.allSettled. - Jangan
awaitdi dalam loop tanpa sadar.for (const id of ids) { await ambil(id); }itu berurutan. Kalau datanya independen, kumpulkan dulu denganids.map(ambil)laluPromise.all. - Terlalu banyak paralel sekaligus bisa membanjiri server atau kehabisan memori. Untuk ratusan request, batasi dengan batch (misalnya 10 per batch) atau library seperti p-limit.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Percepat Dashboard Sekolah
Di dunia nyata, dashboard yang memuat 5 widget data satu per satu terasa lambat dan membuat pengguna kabur. Tantangan ini melatihmu mengubah pemuatan berurutan menjadi paralel dengan aman. Ubah fungsi muatDashboard() di bawah agar ketiga pemanggilan ambilData() berjalan paralel dengan Promise.all, dan kembalikan hasilnya sebagai object { siswa, nilai, jadwal }. Pastikan urutan hasil tetap benar.
<!doctype html> <html> <head> <meta charset="utf-8" /> </head> <body> <h1>Halo JS</h1> <p>Buka console preview untuk melihat output.</p> <script src="index.js"></script> </body> </html>
Kuis Bab
Uji pemahamanmu: Asynchronous: Callback & Promise
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Apa masalah utama 'callback hell' yang diselesaikan oleh Promise?
2.Apa tiga status (state) sebuah Promise?
3.Apa yang sebenarnya dilakukan oleh keyword await?
4.Kapan memakai Promise.all dan kapan Promise.race?
5.Mengapa await di dalam loop for sering dianggap pola yang lambat?