Array.forEach
не надає цієї приналежності (о, якби це було), але є кілька способів досягти того, що ви хочете:
Використання простого лічильника
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 та ін.) Цей підхід гарантує, що всі елементи будуть оброблені, перш ніж викликати зворотний виклик "зроблено". Потрібно скористатися лічильником, який оновлюється при зворотному дзвінку. Залежно від значення показника параметр не дає однакової гарантії, оскільки не повертається порядок повернення асинхронних операцій.
Використання ES6 Обіцянь
(Бібліотеку обіцянок можна використовувати для старих браузерів):
Обробити всі запити, що гарантують синхронне виконання (наприклад, 1, потім 2, потім 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'))
Обробляти всі запити на асинхронізацію без "синхронного" виконання (2 може закінчитися швидше, ніж 1)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log('done'));
Використання бібліотеки асинхронізації
Є й інші асинхронні бібліотеки, асинхроніка є найпопулярнішою, яка забезпечує механізми для вираження того, що ви хочете.
Редагувати
Основну частину питання було відредаговано для видалення раніше синхронного коду прикладу, тому я оновив свою відповідь для уточнення. Оригінальний приклад використовував синхронний код типу для моделювання асинхронної поведінки, тому застосовується наступне:
array.forEach
є синхронним і так є res.write
, тому ви можете просто поставити зворотний дзвінок після дзвінка, щоб передбачити:
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
метод масиву мавdone
параметрallDone
зворотного дзвінка та зворотного дзвінка!