Array.forEach
bu güzelliği sağlamıyorsa (oh, eğer yapacaktır), ancak istediğinizi başarmanın birkaç yolu vardır:
Basit bir sayaç kullanma
function callback () { console.log('all done'); }
var itemsProcessed = 0;
[1, 2, 3].forEach((item, index, array) => {
asyncFunction(item, () => {
itemsProcessed++;
if(itemsProcessed === array.length) {
callback();
}
});
});
(@vanuan ve diğerleri sayesinde) Bu yaklaşım, "tamamlandı" geri çağrısını başlatmadan önce tüm öğelerin işlenmesini garanti eder. Geri aramada güncellenen bir sayaç kullanmanız gerekir. Dizin parametresinin değerine bağlı olarak aynı garanti sağlanmaz, çünkü eşzamansız işlemlerin dönüş sırası garanti edilmez.
ES6 Vaatlerini Kullanma
(eski tarayıcılar için bir vaat kütüphanesi kullanılabilir):
Senkron yürütmeyi garanti eden tüm istekleri işleyin (örneğin 1 sonra 2 sonra 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'))
"Eşzamanlı" yürütme olmadan tüm eşzamansız istekleri işleyin (2, 1'den hızlı bitebilir)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log('done'));
Zaman uyumsuz kitaplık kullanma
Diğer asenkron kütüphaneler vardır zaman uyumsuz istediğini ifade mekanizmalar getirmesi en popüler olmak.
Düzenle
Sorunun gövdesi, daha önce eşzamanlı örnek kodu kaldırmak için düzenlendi, bu yüzden açıklığa kavuşturmak için cevabımı güncelledim. Orijinal örnek, eşzamansız davranışı modellemek için senkron benzeri kod kullandı, bu nedenle aşağıdakiler uygulandı:
array.forEach
olan senkron ve böyledir res.write
sadece foreach için çağrı sonra geri arama koymak, böylece:
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
yöntemidone
geri arama parametresi veallDone
geri arama olsaydı iyi olurdu !