Javascript 循环中承诺的使用(节点)
我正在使用NodeJS后端服务,并使用承诺加载任何数据。现在,我想组合(数组)来自不同来源的项目。我有以下解决方案,但我认为这不是解决类似问题的正确方法Javascript 循环中承诺的使用(节点),javascript,node.js,design-patterns,promise,Javascript,Node.js,Design Patterns,Promise,我正在使用NodeJS后端服务,并使用承诺加载任何数据。现在,我想组合(数组)来自不同来源的项目。我有以下解决方案,但我认为这不是解决类似问题的正确方法 var results = []; loop(items, index, data, results).then(function() { console.log(results); }); function loop(items, index, data, results) { return utils.getPromise
var results = [];
loop(items, index, data, results).then(function() {
console.log(results);
});
function loop(items, index, data, results) {
return utils.getPromise(function(resolve, reject) {
if (index === items.length) {
// Stop
resolve();
} else {
doAction(items[index], data).then(function(result) {
if (result) {
mergeResults(results, result)
} else {
loop(items, index + 1, data, results).then(resolve, reject);
}
}, reject);
}
});
}
function doAction(item, data) {
return utils.getPromise(function(resolve, reject) {
item.doIt(data).then(resolve, reject);
});
}
我认为正确的方法是立即回复承诺,并在运行中添加结果,但我不知道具体如何做到这一点。有什么建议吗?你可以用它来收集承诺的所有结果。然后用一个数组解析.all承诺本身,该数组包含每个承诺的所有单个结果
我认为正确的方法是立即回复承诺
正如您所建议的,您只需返回承诺并根据这些承诺创建一个数组。循环结束后,将此数组放入Promise.all
可能是这样的:
var promiseArray = [];
for(var i=0;i<array.length;i++){
promiseArray.push(doSomethingAsync(array[i]));
}
Promise.all(promiseArray).then(function(responseArray){
//do something with the results
});
var promiseArray=[];
对于(var i=0;i
函数超时(t){
返回新承诺(函数(解析){
setTimeout(函数(){
console.log('完成时间:'+t);
解决();
},t);
});
}
var超时=[];
对于(var l=0;l<20;l++){
timeouts.push(Math.random()*1000 | 0);
}
console.log('start');
Promise.map(超时,功能(t){
返回超时(t);
},{concurrency:3});