2014-11-24 5 views
-1

루프의 마지막 약속이 수행 된 후에이 약속을 어떻게 해결할 수 있습니까? bluebird루프 완료 후 NodeJS 약속 완료

var foo = function(jsonArray){ 
    return Promise.each(jsonArray, doIntensiveWork).each(doMoreIntensiveWork); 
}); 
+3

'->'https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise –

+0

이 나는 ​​블루 버드 문서는이에 대한 설명의 충분를 줄 생각 . 라이브러리에있는 멋진 콜렉션 메소드를 모두 확인해보십시오. 꽤 강력하다고 생각합니다. – thataustin

답변

0

를 사용합니다.

var foo = function(array) { 
    return new Promise.map(array, function(element) { 
     return doIntensiveWork(element).then(doMoreIntensiveWork); 
    }); 
}; 

foo(['bar', 'baz']) 
.then(function(returnedValues) { 
    // returnedValues is an array containing all values 
    // return by your intensive work in foo 
}); 
+0

첫 번째'doMoreIntensiveWork'로 시작하기 전에 모든 doIntensiveWorks를 기다릴 것입니까? – Bergi

+0

@Bergi는 공정하다는 것을 기억하지 못합니다. 여기에는 (.map과 같이) 최적화가 가능하거나 Petka가 아직 구현하지 않기로 결정했을 가능성이 있습니다. 어쨌든 원래의 코드를 기반으로 모든 작업이 순차적으로 진행될 때까지 기다리기를 원하기 때문에 나에게 큰 의미를 부여하지는 않는다. –

3

:

var foo = function(JSONArray){ 
    return new Promise(function(resolve,reject){ 
     for(var i=0; i < JSONArray.length; i++){ 
      doIntensiveWork(JSONArray[i]) 
      .then(doMoreIntensiveWork) //returns a promise 
     } 

     //resolve() after every promise from the loop is fulfilled 
    }) 
} 

나는 당신이 Promise#each을 사용할 수 있습니다 Bluebird

+0

'Promise.map'은 동시에 실행되고 반복 순서를 유지하지 않으며 일반적으로 OP의 원래 코드 (잘못된 반환 값 빼기)를 수행하지 않습니다. –

+0

@BenjaminGruenbaum : 나는 작업이 동시에 이루어져서는 안된다는 어떠한 표시도 보이지 않는다. 'Promise.map'은 여기로가는 길일 것 같습니다. – Bergi

+0

'지도'가 순서를 유지하지 않았다는 것을 알지 못했습니다. 병행성에 관해서는'... map (..., concurrency : 1});'으로 설정할 수 있습니다. 반환 주문이 중요하면 그는 '모두'를 사용할 수 있습니다. –