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 및 기타 사용자에게 감사)이 방법은 "완료"콜백을 호출하기 전에 모든 항목이 처리되도록합니다. 콜백에서 업데이트되는 카운터를 사용해야합니다. 비동기 작업의 반환 순서가 보장되지 않으므로 index 매개 변수의 값에 따라 동일한 보장이 제공되지 않습니다.
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
단순히 foreach 문에 전화 후 콜백을 넣을 수 있도록 :
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
메소드에done
콜백 매개 변수와allDone
콜백 이 있으면 좋을 것입니다 !