Node.js 如何在另一个Promise.all()中使用Promise.all(),然后

Node.js 如何在另一个Promise.all()中使用Promise.all(),然后,node.js,promise,Node.js,Promise,我很确定我把这件事复杂化了,所以非常感谢您的帮助 我有一个包含几个慢方法的类。所以我使用承诺来顺序使用方法,而不使用回调 其中一个方法返回一个数据数组;有必要循环此数组,并对每个值执行不同的方法。为了做到这一点,我正在使用Promise.all。问题是,在原始承诺链移动到下一个承诺链之前,此循环不会完成。然后,在列表中 类别: class worker { slowFunctionOne(list) { return new Promise(function(resolv

我很确定我把这件事复杂化了,所以非常感谢您的帮助

我有一个包含几个慢方法的类。所以我使用承诺来顺序使用方法,而不使用回调

其中一个方法返回一个数据数组;有必要循环此数组,并对每个值执行不同的方法。为了做到这一点,我正在使用Promise.all。问题是,在原始承诺链移动到下一个承诺链之前,此循环不会完成。然后,在列表中

类别:

class worker {
    slowFunctionOne(list) {
        return new Promise(function(resolve, reject) {
            for ( var i in list ) {
                list[i] = ( list[i] * 2 );
            }
            setTimeout(() => resolve(list), 1000);
        });
    }
    slowFunctionTwo(number) {
        return new Promise(function(resolve, reject) {
            number = ( number / 2 );
            setTimeout(() => resolve(number), 1000);
        });
    }
}
module.exports = worker;
主要内容:

输出:

After first method: [ 4, 8, 12, 16, 20 ]
Finally: []
After second method: [ 2, 4, 6, 8, 10 ]
您可以看到slowFunctionOne运行并返回一个数组。然后它遍历该数组,并对每个值执行slowFunctionTwo。我的目的是在承诺完成后,将slowFunctionTwo中所有修改的值放入输出变量中;最后,它应该转到最后一个。然后在原始链中,呼出输出

如您所见,最后一个.then中的代码在Promise.all之前执行


那么我如何做最后的决定呢?然后等待嵌套承诺链中的所有内容都完成了吗?我怀疑async/await是正确的答案,但我不知道如何在不破坏顶级链的情况下将其用于嵌套部分。

您的代码不会等待Promise.all,而是在顶级Promise链通过返回输出继续之前

这里的解决方案是:根本不使用输出。你需要回报我的承诺。所有……然后。。。而不是返回输出,这样您的最终顶层就可以等待承诺了。所有的事情都要先完成

return Promise.all(promises)
        .then(function(number) {
            console.log("After second method:",number);
            return number;
        });

通过在return Promise.all…then…中执行return number,您可以确保将number作为val参数传递给顶级then处理程序。

Boom!就这么简单!非常感谢你。那个简单的改变解决了一切。@flighty我很高兴它起作用了!我刚刚意识到,如果需要的话,您可以消除内部的然后是整体,因为它只是一个passthrough标识函数number=>number,除非您的实际代码让它对number执行其他操作
return Promise.all(promises)
        .then(function(number) {
            console.log("After second method:",number);
            return number;
        });