在数组中运行Promise

时间:2016-02-20 12:32:32

标签: javascript arrays for-loop promise

我有一系列链接,但是这样并行执行它们会导致服务器挂断并超时

var pages = linksArray.then(function(arr){
    return arr.map(function(link) {
              return loader(link);
              });
          }).then(function(data){
            console.log(data);
            return data;
          });

如何加载与链接数组相关联的页面? loader是一个获取html的承诺

1 个答案:

答案 0 :(得分:0)

运行Promise数组的最常见方式是使用array.reduce - 就像这样

var pages = linksArray.then(function (arr) {
    var pArray = [];
    return arr.reduce(function (promise, link) {
        var ret = promise.then(function() {
            return loader(link)
             // the next 3 lines will ensure all links are processed - any failed links will resolve with a value == false
            .catch(function(err) {
                return false;
            });
        });
        pArray.push(ret);
        // next three lines log when each loader has finished
        ret.then(function() {
            console.log('finished', link);
        });
        return ret;
    }, Promise.resolve())
    .then(function() {
        return Promise.all(pArray);
    });
})

然后您可以像这样访问结果

pages.then(function (data) {
    // data is an array of results of loader
    console.log(data);
}).catch(function(err) { // any errors should be logged here
    console.log(err);
});
  

工作原理:简单地说,每次调用loader“等待”直到前一个调用在执行之前被解析 - 每个加载器的有效承诺都保存在一个数组中。一旦最后一个加载器解析,Promise.all将返回一个Promise,它将解析为每个loader

调用的值数组      

如果您需要了解array.reduce的工作原理,请阅读this