Promise & async/await

Menulis kode asinkron yang mudah dibaca dengan Promise, async/await, Promise.all, dan penanganan error.

Part 9 dari 24 ± 40 menit Gratis

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

MetodePerilaku
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 await di dalam forEach — tidak menunggu. Gunakan for...of atau Promise.all(arr.map(...)).
  • Promise yang ditolak tanpa catch → unhandledRejection, yang di Node modern mematikan proses.
  • Menelan error: catch (e) {} tanpa berbuat apa-apa.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X