2017-03-05 4 views
0

나는 비동기 함수를 호출하는 for 루프를 가지고있다. 이 함수는 for 루프의 끝에서 콜백을 호출해야하지만 모든 비동기 함수가 결과를 반환 할 때만 필요합니다. 나는 이것을 시도했다 :콜백이 끝나기 전에 루프 종료를 위해

for(var i = 0; i < vaccinsCount; i++){ 
    getVaccinAddress(i, address, provider, function(result){ 
     if(result.success){ 
     console.log("result:" + result.values); 
     vaccines.push(result.values); 
     } else { 
     callback({success: false, message: result.message}); 
     } 
    }); 
} 
callback({success: true, values: vaccines}); 

대신에 코드가 for 루프를 입력 한 다음 비동기 함수를 호출 한 다음 straigh를 빠져 나온다. 어떻게이 문제를 해결할 수 있을까요?

getVaccinAddress는 서버 호출을 수행하는 비동기 함수입니다. 내가 NodeJS를 사용하고

편집

이 때문에이 솔루션은 다음 블루 버드 사용하는 것입니다, 그러나 나는이 블루 버드 구현하는 방법에 대한 아무 생각이 없습니다. vaccines.lengthvaccinsCount

for(var i = 0; i < vaccinsCount; i++) { 
    (function(i) { 
    getVaccinAddress(i, address, provider, function(result) { 
     if(result.success) { 
     console.log("result:" + result.values); 
     vaccines.push(result.values); 
     if (vaccines.length === vaccinsCount) { 
      // call `callback()` here 
     }    
     } 
    }); 
    })(i); 
} 
+0

검색을하고 내가 가진 – mplungjan

+0

비동기 루프 구글과 I 내가 어떻게 작동하게 할 수 있는지 이해하지 못한다. –

+0

코드가 불완전하면 getVaccinAddress 함수에 무엇이 있습니까? –

답변

2

당신은 내가보기 엔이 경우 약속을 사용하는 것이 좋습니다 callback()를 호출 할 수 있습니다. 그것은 당신의 비동기 호출을 관리 할 수있는 좋은 방법 : https://davidwalsh.name/promises

당신은 당신의 코드는 다음과 같이 보일 것이다 약속을 사용하는 경우 여전히 돈을 SO

var promises = [] 
for(var i = 0; i < vaccinsCount; i++){ 
    promises.push(getVaccinAddress(i, address, provider)); 
    // getVaccinAddress will need to return a promise 
} 

Promise.all(promises).then(function(result) { 
    console.log('success'); 
}) 
.catch(function(err) { 
    console.log(err); 
}); 
+0

나는 이것을 시도했지만 코드는 절대로 들어 가지 않습니다. (vaccines.lenght === vaccinesCOunt) –

+0

@ Rémi _ "나는 이것을 시도했지만 if 코드에 결코 들어 가지 않습니다. (vaccines.lenght === vaccinesCOunt) "_ 그 이유는 오류가 발생하거나 예상 결과가'result.success'가'true'로 평가되지 않는다는 것입니다. 이는'vaccines.length === vaccinsCount'가 평가하지 않는 한 가지 이유가 될 수 있습니다 진정한 의미로. 'result.success'가'true'로 평가 되더라도'i'가'vaccinsCount'와 같으면'콜백'을 호출 할 수 있습니다. 오류가 기록 되었습니까? 'getVaccinAddress'에 대한 모든 호출에 대해'result.success'는'true'입니까? – guest271314

3

에 동일 할 때

+0

promis를 사용하고 있지만 NodeJS에서 코딩 중이므로이 작업을 수행하는 방법을 잘 모릅니다. –

+0

@ Rémi는 Bluebirdjs를 사용합니다. – majidarif

+0

NodeJS를 사용하는 경우 더욱 좋습니다. http://bluebirdjs.com/docs/getting-started.html – timhysniu