循环中使用promises(节点)

Flo*_*son 0 javascript design-patterns node.js promise

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

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);
    });
}
Run Code Online (Sandbox Code Playgroud)

我认为正确的方法是立即返回一个承诺,并在运行中添加结果,但我不确切知道如何做到这一点.有什么建议?

Tob*_*obi 6

您可以使用Promise.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
});
Run Code Online (Sandbox Code Playgroud)