Array.forEach
không cung cấp sự độc đáo này (ồ nếu có) nhưng có một số cách để thực hiện những gì bạn muốn:
Sử dụng một bộ đếm đơn giản
function callback () { console.log('all done'); }
var itemsProcessed = 0;
[1, 2, 3].forEach((item, index, array) => {
asyncFunction(item, () => {
itemsProcessed++;
if(itemsProcessed === array.length) {
callback();
}
});
});
(cảm ơn @vanuan và những người khác) Cách tiếp cận này đảm bảo rằng tất cả các mục được xử lý trước khi gọi lại cuộc gọi lại "đã hoàn thành". Bạn cần sử dụng một bộ đếm được cập nhật trong cuộc gọi lại. Tùy thuộc vào giá trị của tham số chỉ mục không cung cấp cùng một bảo đảm, bởi vì thứ tự trả về của các hoạt động không đồng bộ không được đảm bảo.
Sử dụng lời hứa ES6
(một thư viện lời hứa có thể được sử dụng cho các trình duyệt cũ hơn):
Xử lý tất cả các yêu cầu đảm bảo thực hiện đồng bộ (ví dụ 1 rồi 2 rồi 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'))
Xử lý tất cả các yêu cầu không đồng bộ mà không thực hiện "đồng bộ" (2 có thể kết thúc nhanh hơn 1)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log('done'));
Sử dụng thư viện không đồng bộ
Có thư viện không đồng bộ khác, async là phổ biến nhất, đó là cung cấp cơ chế để thể hiện những gì bạn muốn.
Biên tập
Phần chính của câu hỏi đã được chỉnh sửa để xóa mã ví dụ đồng bộ trước đó, vì vậy tôi đã cập nhật câu trả lời của mình để làm rõ. Ví dụ ban đầu được sử dụng đồng bộ như mã để mô hình hóa hành vi không đồng bộ, do đó, áp dụng như sau:
array.forEach
là đồng bộ và cũng vậy res.write
, vì vậy bạn chỉ cần đặt lại cuộc gọi của mình sau cuộc gọi của bạn để báo trước:
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
phương thức mảng tiêu chuẩn códone
tham sốallDone
gọi lại và gọi lại!