2017-12-25 3 views
1

저는 각 항목에 대해 동일한 순서로 일련의 작업을 실행하고 정보를 수집 한 다음 끝에 통계를 보내려고합니다. 예상대로 때문에 실행된다 (5 :nodejs가 foreach를 사용하여 순서대로 실행합니다.

let listOfItems = []; 
assignedItems.forEach(async (item) => { 
    let id = item.myID; 
    totalItemCount += await itemRepository.getItemCount(id); 

    let itemDetail = await itemRepository.getDetails(id); 
    listOfItems.push(item.name); 
}, this); 
console.log(listOfItems.length); // 0 ?? 

VS

let listOfItems = []; 
for (let i = 0; i < assignedItems.length; i++) { 
    let id = assignedItems[i].myID; 
    totalItemCount += await itemRepository.getItemCount(id); 

    let itemDetail = await itemRepository.getDetails(id); 
    listOfItems.push(itemDetail.name); 
} 
console.log(listOfItems.length); // 5 as expected 

출력 사용의 foreach는 : (foreach는 나중에 실행되기 때문에) 0 출력에 사용 여기

는 예 코드 코드 실행이 기록됨)

주요 문제는 foreach가 foreach 다음에 작성되는 console.logs 다음에 실행됩니다. 전나무를 수집하려고합니다. 모든 항목에 대한 모든 정보를 입력 한 다음 수집 한 데이터를 보냅니다.

대체 무엇을하고 있습니까? foreach를 사용하여 문제를 해결하려면 어떻게해야합니까?

답변

4

.forEach() 원하는 방식대로 await과 작동하지 않습니다. 실제로 for 루프를 사용하여 await을 직렬화하려는 경우에만 사용하십시오.

.forEach()을 사용하지 않는 데 문제가 있으면 해당 문제를 해결할 수 있도록 문제를 설명해주세요.

.forEach()은 동기식이며 await이 아니므로 변경할 수 없습니다. 반복의 각 반복을 await로 바꾸려면 다르게 루프해야합니다. for 루프는 ES6 (ES6의 명시 적으로 설계된 기능)에서이를 수행하거나 await이 될 자체 수동 루프를 사용자 정의 할 수 있지만 .forEach()은 수행하지 않습니다.

도대체 무슨 일을하고 있니?

.forEach()은 동기식입니다. 그것은 await 귀하의 약속을하지 않습니다. 이것이 디자인 된 방법입니다.

어떻게 foreach를 사용하여 문제를 해결합니까?

그렇지 않습니다. 계속 진행하기 전에 루프의 각 반복을 기다리려면 일반 for 루프를 사용하십시오. 이것은 이 아닌 일반 for 루프를 사용하는 ES6의 기능입니다.


참고로, 당신이 원하는 경우에 약속을 위해, 당신은 Bluebird promise library을 사용할 수 있으며 Promise.mapSeries() 또는 Promise.each() 같은 것을 사용 대기 기능 같은 .forEach(). 이러한 함수는 콜백에서 반환 된 약속을 찾고 약속이 해결 될 때까지 다음 반복을 실행하지 않습니다. 그러나 array.forEach()에는 해당 기능이 내장되어 있지 않습니다.


시리즈에서 비동기 작업을 호출 배열을 통해 시퀀싱에 대한 .reduce()를 사용하여 패턴과 약속 ​​디자인도 있습니다. 당신은이 대답에 그 패턴의 예를 볼 수있는 링크 이외의 실제 내용을 포함하지 않는

how to write to new files sequentially

Can Promise load multi urls in order?

iterating over promises node js

how to make synchronous http calls using promises in node.js

1

이 기사를 읽으면서 답변을 찾을 수 있기를 바랍니다. Here is the link

+1

답변하지 이내입니다을 스택 오버 플로우 지침 답변에는 실제 콘텐츠 자체가 포함되어야합니다. 이는 외부 링크가 시간이 지남에 따라 콘텐츠를 변경하거나 변경하는 습관을 가지며 장기적인 참조로 응답의 유용성을 없애기 때문입니다. – jfriend00

+0

나는 좀 더 심층적 인 대답을 기대했다. – dGRAMOP