在setter中使用它们时排队

时间:2017-03-31 01:17:02

标签: javascript node.js asynchronous promise lodash

我正在尝试遍历数组并使用异步函数设置每个元素的一个属性。我想把这整件作为一个承诺归还。排队所有这些承诺的好方法是什么? (如果需要,我可以导入NodeJS库。)

代码基本上如下所示:

.then(articles => {
    articles.forEach(article => {
      article.content = someAsyncFunction();
    });
    // How do I queue up and return each of these promises?
})
.then(() => { /* other stuff... */ })

2 个答案:

答案 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个结果,所以我不会在这里详细介绍。