我有一系列链接,但是这样并行执行它们会导致服务器挂断并超时
var pages = linksArray.then(function(arr){
return arr.map(function(link) {
return loader(link);
});
}).then(function(data){
console.log(data);
return data;
});
如何加载与链接数组相关联的页面? loader是一个获取html的承诺
答案 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