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.