Ale*_*lls 8 javascript node.js ecmascript-6 es6-promise
我看到Promise.all的这个示例实现 - 它并行运行所有promise - 实现Promise.all
请注意,我正在寻找的功能类似于Bluebird的Promise.mapSeries http://bluebirdjs.com/docs/api/mapseries.html
我正在尝试创建Promise.series,我有这个似乎按预期工作(它实际上是完全错误的,不要使用它,看到答案):
Promise.series = function series(promises){
return new Promise(function(resolve,reject){
const ret = Promise.resolve(null);
const results = [];
promises.forEach(function(p,i){
ret.then(function(){
return p.then(function(val){
results[i] = val;
});
});
});
ret.then(function(){
resolve(results);
},
function(e){
reject(e);
});
});
}
Promise.series([
new Promise(function(resolve){
resolve('a');
}),
new Promise(function(resolve){
resolve('b');
})
]).then(function(val){
console.log(val);
}).catch(function(e){
console.error(e.stack);
});
Run Code Online (Sandbox Code Playgroud)
但是,这个实现的一个潜在问题是,如果我拒绝承诺,它似乎没有抓住它:
Promise.series([
new Promise(function(resolve, reject){
reject('a'); // << we reject here
}),
new Promise(function(resolve){
resolve('b');
})
]).then(function(val){
console.log(val);
}).catch(function(e){
console.error(e.stack);
});
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么错误没有被捕获,如果有一种方法来解决这个与Promises?
根据评论,我做了这个改变:
Promise.series = function series(promises){
return new Promise(function(resolve,reject){
const ret = Promise.resolve(null);
const results = [];
promises.forEach(function(p,i){
ret.then(function(){
return p.then(function(val){
results[i] = val;
},
function(r){
console.log('rejected');
reject(r); // << we handle rejected promises here
});
});
});
ret.then(function(){
resolve(results);
},
function(e){
reject(e);
});
});
}
Run Code Online (Sandbox Code Playgroud)
但这仍然没有按预期工作......
then循环中返回的 PromiseforEach不处理潜在的错误。
正如 @slezica 的评论中指出的,尝试使用reduce而不是forEach,这会将所有承诺链接在一起。
Promise.series = function series(promises) {
const ret = Promise.resolve(null);
const results = [];
return promises.reduce(function(result, promise, index) {
return result.then(function() {
return promise.then(function(val) {
results[index] = val;
});
});
}, ret).then(function() {
return results;
});
}
Run Code Online (Sandbox Code Playgroud)
请记住,此时承诺已经“运行”。如果您确实想连续运行您的 Promise,则应该调整您的函数并传入返回 Promise 的函数数组。像这样的东西:
Promise.series = function series(providers) {
const ret = Promise.resolve(null);
const results = [];
return providers.reduce(function(result, provider, index) {
return result.then(function() {
return provider().then(function(val) {
results[index] = val;
});
});
}, ret).then(function() {
return results;
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4720 次 |
| 最近记录: |