2017-03-15 4 views
-2

다음 코드를 사용하면 마지막 콜백이 업데이트 된 변수를 반환하는지 확인할 수 있습니까?중첩 비동기 함수

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
    }) 
    cb1(); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); // will this be updated for all the collection.anotherarray.number ? 
}) 
+1

'forEach' 내부에'cb1'을 콜백으로 전달하고 즉시 호출하지 않아야합니다! – Bergi

+0

@Bergi 내부 비동기의 최종 콜백 내부에서 호출하는 것이 좋습니다. –

답변

0

.forEach의 세 번째 매개 변수는 이중 목적을 제공 : 콜백으로 모든 반복이 완료 또는 오류를보고 할 때. 내부 .forEach에 그 콜백 내부 cb1() 전화 :

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
     cb1(); 
    }); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); 
}) 

당신이 작성한 접근 방식은 거의 확실히 제대로 작동하지 않습니다. 바깥 쪽 .forEach은 너무 빨리 끝났다고 가정합니다.