【问题标题】:How to use Promise.all() inside of another promise .then chain如何在另一个 Promise.then 链中使用 Promise.all()
【发布时间】:2019-12-14 09:03:50
【问题描述】:

我很确定我过于复杂了,因此非常感谢您的帮助!

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

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

类:

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;

主要:

const worker = require('./worker');

var w = new worker();

var list = [2,4,6,8,10];

var promises = [];

w.slowFunctionOne(list)
    .then(function(value) {
        console.log("After first method:",value);
        for ( i in value ) {
            promises.push(w.slowFunctionTwo(value[i]));
        }
        var output = [];
        Promise.all(promises)
            .then(function(number) {
                console.log("After second method:",number);
                output = number;
            });
        return output;
    })
    .then(function(val) {
        console.log("Finally:",val);
    });

输出:

After first method: [ 4, 8, 12, 16, 20 ]
Finally: []
After second method: [ 2, 4, 6, 8, 10 ]

所以你可以看到 slowFunctionOne() 运行并返回一个数组。然后它遍历该数组并对每个值执行 slowFunctionTwo()。我的意图是在 Promise.all() 完成后,将所有来自 slowFunctionTwo() 的修改值放入“输出”变量中;最后它应该转到原始链中的最后一个 .then() 并回显“输出”。

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

那么我如何让最终的 .then() 等到嵌套的 Promise 链中的所有内容都完成?我怀疑 async/await 是正确的答案,但我不知道如何在不搞砸顶级链的情况下将其用于嵌套部分。

【问题讨论】:

    标签: node.js promise


    【解决方案1】:

    在您的顶级 Promise 链通过 return output 继续之前,您的代码不会等待 Promise.all

    这里的解决方案是:根本不要使用output。您需要return Promise.all(...).then(...)(而不是return output),以便您的最终顶级then 等待Promise.allthen 先完成。

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

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

    【讨论】:

    • 轰隆隆!就这么容易!太感谢了。这个简单的改变解决了一切。
    • @Fliggerty 我很高兴它成功了!我刚刚意识到您可以根据需要消除内部的then 整体,因为它只是一个直通身份函数(number=>number),除非您的真实代码使用number 做其他事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-10-14
    • 2020-01-18
    • 2020-08-06
    相关资源
    最近更新 更多