2014-11-24 3 views
-1

Как я могу решить это обещание после выполнения последнего обещания в цикле?NodeJS разрешить обещание после завершения цикла

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 
    }) 
} 

Я использую Bluebird

+3

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

+0

Я думаю, что Bluebird документы дают более чем достаточно объяснения этого , Посмотрите все классные методы сбора, которые находятся в библиотеке, я думаю, вы найдете их достаточно мощными. – thataustin

ответ

0

Вы можете использовать Promise#each:

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

Будет ли это ждать всех 'doIntensiveWork', прежде чем начинать с первого' doMoreIntensiveWork'? – Bergi

+0

@ Bergi, чтобы быть справедливым, я не помню, вполне возможно, что здесь есть оптимизация (например, в '.map') или что Petka предпочла не реализовывать ее еще. В любом случае это не кажется мне огромным делом, поскольку OP хочет дождаться, когда все задания будут выполняться последовательно в любом случае на основе исходного кода, и я предполагаю, что это займет примерно столько времени. –

3

С bluebird.

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

'Promise.map' запускается одновременно, не сохраняет порядок итераций и, как правило, не делает то, что делает исходный код OP (минус неправильное возвращение). –

+0

@BenjaminGruenbaum: Я не вижу никаких указаний в OP, что работа не должна выполняться одновременно. 'Promise.map', кажется, просто путь сюда. – Bergi

+0

Я не знал, что 'map' не сохранил заказ. О параллелизме можно установить с помощью: ... map (..., {parallelurrency: 1}); '. Если обратный порядок важен, он может использовать 'all'. –

Смежные вопросы