Javascript 循环中承诺的使用(节点)

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

我正在使用NodeJS后端服务,并使用承诺加载任何数据。现在,我想组合(数组)来自不同来源的项目。我有以下解决方案,但我认为这不是解决类似问题的正确方法

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});