Promise & async/await
Menulis kode asinkron yang mudah dibaca dengan Promise, async/await, Promise.all, dan penanganan error.
Promise: janji hasil di masa depan
Promise adalah objek yang mewakili hasil operasi asinkron yang belum selesai. Ia punya tiga keadaan: pending (menunggu), fulfilled (berhasil, punya nilai), atau rejected (gagal, punya alasan/error).
const tunggu = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
tunggu(1000)
.then(() => console.log('sudah 1 detik'))
.catch((err) => console.error(err))
.finally(() => console.log('selesai'));
Membuat Promise
function ambilPengguna(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id < 1) return reject(new Error('ID tidak valid'));
resolve({ id, nama: 'Pengguna ' + id });
}, 50);
});
}
async/await: gaya sinkron untuk kode asinkron
Fungsi async selalu mengembalikan Promise. Di dalamnya, await "menunggu" Promise selesai tanpa memblokir event loop dan memberikan nilainya langsung.
async function tampilkan(id) {
try {
const user = await ambilPengguna(id);
console.log(user.nama);
} catch (err) {
console.error('Gagal:', err.message); // menangkap reject DAN error biasa
} finally {
console.log('beres');
}
}
Bandingkan dengan callback hell: alur terbaca dari atas ke bawah dan try/catch menangani error asinkron dengan wajar.
Berurutan vs paralel
// BERURUTAN: total ±300 ms (tiap await menunggu yang sebelumnya)
const a = await ambilPengguna(1);
const b = await ambilPengguna(2);
const c = await ambilPengguna(3);
// PARALEL: total ±100 ms (semua dimulai bersamaan)
const [a, b, c] = await Promise.all([ambilPengguna(1), ambilPengguna(2), ambilPengguna(3)]);
Gunakan await berurutan hanya bila langkah berikutnya bergantung pada hasil sebelumnya.
Penggabung Promise
| Metode | Perilaku |
|---|---|
Promise.all([...]) | Menunggu semua berhasil; gagal begitu satu gagal |
Promise.allSettled([...]) | Menunggu semua selesai (berhasil/gagal) dan melaporkan masing-masing |
Promise.race([...]) | Hasil promise yang pertama selesai |
Promise.any([...]) | Hasil promise pertama yang berhasil |
Mengubah callback menjadi Promise
const { promisify } = require('util');
const fs = require('fs');
const readFile = promisify(fs.readFile);
const isi = await readFile('data.json', 'utf8');
Banyak modul punya versi Promise bawaan: require('fs/promises'), require('timers/promises').
Kesalahan umum
- Lupa
await→ kamu mendapat Promise, bukan nilainya. - Memakai
awaitdi dalamforEach— tidak menunggu. Gunakanfor...ofatauPromise.all(arr.map(...)). - Promise yang ditolak tanpa
catch→unhandledRejection, yang di Node modern mematikan proses. - Menelan error:
catch (e) {}tanpa berbuat apa-apa.