Latihan buat 11 Pemrograman Asinkron. Konsep:
async/await,Promise,Promise.all, dan cara kerja resolve/reject. Jawaban di 11 Kunci Jawaban Async.
11.1 Waktu Sepi
Ada log kamera: file "camera_logs.txt" berisi daftar nama file log; tiap file log berisi satu timestamp (Date.now()) per baris. Tulis fungsi async activityTable(day) yang mengembalikan array 24 angka (satu per jam) berisi jumlah observasi pada jam itu, untuk hari tertentu (Date.getDay: Minggu 0, Sabtu 6).
Kode awal:
async function activityTable(day) {
let daftarFile = await textFile("camera_logs.txt");
// tulis kodemu di sini
}
activityTable(1)
.then(tabel => console.log(activityGraph(tabel)));Petunjuk: textFile(nama) mengembalikan promise berisi isi file. Pisahkan isi dengan split("\n"). Buat tabel 24 angka (isi 0), lalu loop tiap file log (await textFile(...)), tiap timestamp jadikan new Date(Number(ts)), dan kalau harinya cocok, tambah tabel[date.getHours()]. Konsep di 11 Pemrograman Asinkron > Fungsi async.
→ Jawaban: 11 Kunci Jawaban Async > 11.1 Waktu Sepi
11.2 Promise Murni
Tulis ulang fungsi 11.1 tanpa async/await, pakai method Promise biasa (then, Promise.all). Kalau membaca file butuh waktu, mana yang lebih cepat — versi ini atau 11.1? Kalau satu file gagal dibaca, bagaimana kegagalan itu sampai ke promise yang dikembalikan?
Kode awal:
function activityTable(day) {
// tulis kodemu di sini
}
activityTable(6)
.then(tabel => console.log(activityGraph(tabel)));Petunjuk: then pertama membaca daftar file, split, lalu map(textFile) dan Promise.all. Untuk penjadwalan terbaik, taruh analisis tiap file di dalam Promise.all supaya bisa mulai begitu file pertama datang. Konsep di 11 Pemrograman Asinkron > Promise.
→ Jawaban: 11 Kunci Jawaban Async > 11.2 Promise Murni
11.3 Membangun Promise.all
Implementasikan sendiri Promise_all(promises): mengembalikan promise yang menunggu semua promise selesai lalu resolve ke array hasil (urutan sesuai input); kalau ada yang gagal, ikut gagal dengan alasan yang sama.
Kode awal:
function Promise_all(promises) {
return new Promise((resolve, reject) => {
// tulis kodemu di sini
});
}Petunjuk: panggil then pada tiap promise. Saat satu berhasil, simpan nilainya di results[i] dan kurangi sebuah counter pending; resolve saat pending mencapai 0. Tangani array kosong (resolve langsung). Untuk kegagalan, cukup oper reject sebagai handler catch tiap promise. Konsep di 11 Pemrograman Asinkron > Proyek Seni Corvid.
→ Jawaban: 11 Kunci Jawaban Async > 11.3 Membangun Promise.all