Kunci jawaban 11 Latihan Async.

11.1 Waktu Sepi

 
async function activityTable(day) {
 
let tabel = [];
 
for (let i = 0; i < 24; i++) tabel[i] = 0;
 
  
 
let daftarFile = await textFile("camera_logs.txt");
 
for (let nama of daftarFile.split("\n")) {
 
let log = await textFile(nama);
 
for (let ts of log.split("\n")) {
 
let tanggal = new Date(Number(ts));
 
if (tanggal.getDay() == day) {
 
tabel[tanggal.getHours()]++;
 
}
 
}
 
}
 
return tabel;
 
}
 

Kenapa: dua await bersarang di dua loop — yang luar membaca tiap file log, yang dalam memproses tiap timestamp. Ini gaya linear: tiap file dibaca berurutan (nunggu satu selesai baru lanjut). Number(ts) mengubah string timestamp jadi angka sebelum new Date.

→ Soal: 11 Latihan Async > 11.1 Waktu Sepi

11.2 Promise Murni

 
function activityTable(day) {
 
let tabel = [];
 
for (let i = 0; i < 24; i++) tabel[i] = 0;
 
  
 
return textFile("camera_logs.txt").then(daftarFile => {
 
return Promise.all(daftarFile.split("\n").map(nama => {
 
return textFile(nama).then(log => {
 
for (let ts of log.split("\n")) {
 
let tanggal = new Date(Number(ts));
 
if (tanggal.getDay() == day) {
 
tabel[tanggal.getHours()]++;
 
}
 
}
 
});
 
}));
 
}).then(() => tabel);
 
}
 

Kenapa: versi ini lebih cepat karena semua file dibaca berdampingan lewat Promise.all, sedangkan versi await menunggu tiap file berurutan. Bayarannya: urutan kejadian kurang bisa diprediksi (di sini aman karena cuma menambah angka). Kalau satu file gagal, textFile-nya reject → Promise.all ikut reject → callback then pertama mengembalikan promise gagal → callback then kedua gak dipanggil, dan fungsi mengembalikan promise yang gagal.

→ Soal: 11 Latihan Async > 11.2 Promise Murni

11.3 Membangun Promise.all

 
function Promise_all(promises) {
 
return new Promise((resolve, reject) => {
 
let results = [];
 
let pending = promises.length;
 
for (let i = 0; i < promises.length; i++) {
 
promises[i].then(nilai => {
 
results[i] = nilai;
 
pending--;
 
if (pending == 0) resolve(results);
 
}).catch(reject);
 
}
 
if (promises.length == 0) resolve(results);
 
});
 
}
 

Kenapa: results[i] = nilai menaruh tiap hasil di posisinya, jadi urutan array hasil tetap sesuai input walau promise selesai dengan urutan acak. Counter pending mulai dari jumlah promise dan turun tiap sukses; saat 0, semua sudah selesai → resolve. if (promises.length == 0) resolve(results) menangani array kosong (tanpa itu takkan pernah resolve karena tak ada promise yang memicu cek). .catch(reject) cukup karena reject kedua kali dan seterusnya diabaikan — kegagalan pertama langlung menggagalkan pembungkusnya.

→ Soal: 11 Latihan Async > 11.3 Membangun Promise.all