Materi
Fungsi yang ditulis dengan async function selalu mengembalikan Promise: nilai yang di-return menjadi isi fulfilled, dan error yang dilempar menjadi penolakan. Di dalamnya, await menghentikan sementara fungsi itu sampai Promise di kanannya selesai, lalu memberi nilainya. Badan fungsi async berjalan seperti fungsi biasa sampai await pertama; sisanya dilanjutkan sebagai microtask setelah Promise itu selesai, dan selama menunggu, bagian program lain tetap berjalan. Bila Promise-nya ditolak, await melempar alasannya seperti throw, sehingga try dan catch dari modul error menangkapnya persis seperti error sinkron. await hanya boleh ditulis di dalam fungsi async atau di tingkat teratas modul.
async function ongkirKe(kota, ambilTarif) {
try {
const tarif = await ambilTarif(kota);
return tarif.perKilo * 2;
} catch (e) {
return null; // kota di luar jangkauan
}
}await yang ditulis berurutan menunggu satu per satu: pekerjaan kedua baru dimulai setelah yang pertama selesai. Bila beberapa pekerjaan tidak saling bergantung, mulai semuanya dulu lalu tunggu bersama dengan Promise.all. Promise.all fulfilled dengan array hasil sesuai urutan input, bukan urutan selesainya, dan ditolak begitu salah satu isinya ditolak, dengan alasan penolakan pertama itu. Promise.allSettled menunggu semuanya selesai dan memberi satu objek per isi: { status: "fulfilled", value } atau { status: "rejected", reason }. Promise.race selesai mengikuti Promise pertama yang selesai, entah fulfilled atau rejected, dan dipakai untuk memasang batas waktu.
// di dalam fungsi async
const [kurs, tarif] = await Promise.all([ambilKurs(), ambilTarif("Kupang")]);
const hasil = await Promise.allSettled([ambilKurs(), Promise.reject(new Error("putus"))]);
hasil.map((h) => h.status); // ["fulfilled", "rejected"]