Array.forEach
tidak menyediakan keramahtamahan ini (oh jika itu mau) tetapi ada beberapa cara untuk mencapai apa yang Anda inginkan:
Menggunakan penghitung sederhana
function callback () { console.log('all done'); }
var itemsProcessed = 0;
[1, 2, 3].forEach((item, index, array) => {
asyncFunction(item, () => {
itemsProcessed++;
if(itemsProcessed === array.length) {
callback();
}
});
});
(terima kasih kepada @vanuan dan lainnya) Pendekatan ini menjamin bahwa semua item diproses sebelum memanggil callback "selesai". Anda perlu menggunakan penghitung yang diperbarui dalam panggilan balik. Tergantung pada nilai parameter indeks tidak memberikan jaminan yang sama, karena urutan pengembalian operasi asinkron tidak dijamin.
Menggunakan ES6 Janji
(perpustakaan janji dapat digunakan untuk browser lama):
Memproses semua permintaan yang menjamin eksekusi secara sinkron (mis. 1 kemudian 2 kemudian 3)
function asyncFunction (item, cb) {
setTimeout(() => {
console.log('done with', item);
cb();
}, 100);
}
let requests = [1, 2, 3].reduce((promiseChain, item) => {
return promiseChain.then(() => new Promise((resolve) => {
asyncFunction(item, resolve);
}));
}, Promise.resolve());
requests.then(() => console.log('done'))
Memproses semua permintaan async tanpa eksekusi "sinkron" (2 mungkin selesai lebih cepat dari 1)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log('done'));
Menggunakan pustaka async
Ada perpustakaan asinkron lainnya, async menjadi yang paling populer, yang menyediakan mekanisme untuk mengekspresikan apa yang Anda inginkan.
Edit
Isi pertanyaan telah diedit untuk menghapus kode contoh yang sebelumnya sinkron, jadi saya telah memperbarui jawaban saya untuk menjelaskan. Contoh asli menggunakan kode suka sinkron untuk memodelkan perilaku asinkron, jadi yang berikut ini diterapkan:
array.forEach
adalah sinkron dan begitu juga res.write
, sehingga Anda hanya dapat menempatkan panggilan balik Anda setelah panggilan Anda untuk foreach:
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
metode array standar memilikidone
parameterallDone
panggilan balik dan panggilan balik!