我正在尝试遍历数组并使用异步函数设置每个元素的一个属性。我想把这整件作为一个承诺归还。排队所有这些承诺的好方法是什么? (如果需要,我可以导入NodeJS库。)
代码基本上如下所示:
.then(articles => {
articles.forEach(article => {
article.content = someAsyncFunction();
});
// How do I queue up and return each of these promises?
})
.then(() => { /* other stuff... */ })
答案 0 :(得分:0)
使用promise.all。 js小提琴:https://jsfiddle.net/rohitanand/fdkt16L2/
function createPromise(value,aftertime){
return new Promise(function(resolve){
setTimeout(function(){
resolve(value);
},aftertime)
})
}
var abc = Promise.resolve({a:1,b:2,c:3})
.then(function(value){
var promisearr =[];
promisearr.push(createPromise(5,1000).then(function(val){ value.a = val;}));
promisearr.push(createPromise(10,2000).then(function(val){ value.b = val;}));
promisearr.push(createPromise(15,3000).then(function(val){ value.c = val;}));
return Promise.all(promisearr).then(function(){return value});
}).then(function(value){
console.log(value);
})

答案 1 :(得分:0)
假设您更改10
以返回承诺,则可以调用someAsyncFunction
为每个条目值调用函数并获取一系列未完成的承诺。将数组传递给articles.reduce
会返回单个承诺以成功完成,但如果任何单个操作失败,将拒绝返回承诺。 (我希望现在最近版本的Node.js支持Promise.all
。
Promise.all
的实现值是一个结果数组,包含输入promise的所有已满足值。因此,您使用结果数组来设置Promise.all
中具有匹配索引的条目的content
属性。
但是,未完成承诺的初始数量与articles
中的条目数相同。如果这可能很大或非常大,您可能不希望启动那么多并发活动异步请求。对此的解决方案是使用“异步”递归来一个接一个地串行处理异步请求。
搜索SO的“[javascript]异步递归”有300个结果,所以我不会在这里详细介绍。