Javascript - 如何正确处理循环的承诺?

时间:2016-11-22 21:40:37

标签: javascript arrays promise

我正在使用promises来处理任务列表:

这是代码示例:

var array = ["aaa", "bbbb", "cccc", "dddd", "eeee"];
var result = [];
var p = Promise.resolve({ 
  then: function(onFulfill, onReject) { 
   array.forEach(function(x){
     // http request with x and make sure this request ends before a new one if fired
     // put http resolte in array : result.push(httpRespose); 
   });
   //when done, onFulfill(result) 
}
});
p.then(
function(v) {
    console.log(v); // "fulfilled!"
  }, function(e) {
      console.log(e); // not called
});

我希望能够使用数组中的每个元素创建和http请求,然后将结果放入另一个数组中,并在完成后返回该新数组。我还想知道是否可以确保以相同的顺序添加http结果(这不是很重要)。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

Promise.all用于等待许多承诺履行。

每次创建承诺时,将其推入数组,然后使用

Promise.all(myPromiseArray).then(allDoneHandler)

以下是一个例子:

var items = [ 500, 1000, 1500 ];
var results = [];
items.forEach((item) => {
  let promise = new Promise((resolve) => {
    setTimeout(() => {
        console.log(item);
        resolve(item);
    }, item);
  });
  results.push(promise);
});
Promise.all(results).then(() => {
    console.log('done!');
});
            

答案 1 :(得分:1)

To"运行承诺"按顺序(特别是从数组中),您可以使用此模式:

var donePromise = arrayOfData.reduce(function(sequence, value, index){
    return sequence.then(function(){
        //doSomethingWithValueAndReturnAPromise
    })
}, Promise.resolve());

但是既然你想要积累的结果,而不仅仅是工作完成后的指标,我们需要对此进行调整:

我们正在使用Array.map()Promise.all()来累积结果,并采用与上述类似的方法来确保顺序执行:

var urls = [/*...*/];

var _sequence = Promise.resolve();
Promise.all(urls.map(function(url) {
    return _sequence = _sequence.then(function(){
        //fetch the url and return a Promise:  
        //return fetch(url).then(response => response.text())
    });
})).then(function(results){
    //console.log(results)
});