node.js - NodeJS中promise如何通过多层回调解析所有数据

标签 node.js callback promise resolve

假设我在 NodeJS 中使用 Promise 有以下源代码(使用 3 个集合连接到 mongodb,嗯,这并不重要)

function getData(){
    return new promise((resolve, reject) => {
        var dataArray = [];
        getCollection1().then((rows1) => {
            getCollection2().then((rows2) => {
                var val = someDataProcessingFunction(rows1, rows2);
                dataArray.push(val);

                resolve(dataArray);
            }, (err) => {
                reject(err);
            }
        }, (err) => {
            reject(err);
        });

        getCollection3().then((rows3) => {
            rows3.forEach((row3) => {
                dataArray.push(row3);
            });
            resolve(dataArray);
        }, (err) => {
            reject(err);
        });
    });
}

问题是,有多个地方推送了dataArray,但我不知道什么时候所有推送完成。这样我不知道何时解析,将数据返回给用户,例如通过express中的response.send。对于上面的代码,当我多次使用resolve时,我只会得到返回的全部数据的一部分。

我可以想出两种解决方法,但都不好。一是把所有的解析都放在setTimeout中,这意味着我必须延迟对用户的响应。

还有一种是一开始就统计所有的推送次数,每次推送一项就减1。当时间变为0时,做决定。但在进行真正的循环之前通常很难计算出这个数字。

有更好的解决方案吗?谢谢你并爱你:)

最佳答案

首先,避免 Promise constructor antipattern并使用返回值代替!对于多层异步函数,只需使用多层 Promise 即可。要一次等待多个 promise ,请使用 Promise.all :

function getData(){
    return Promise.all([
        getCollection1(),
        getCollection2(),
        getCollection3()
    ]).then(([rows1, rows2, rows3]) => {
        return [someDataProcessingFunction(rows1, rows2)].concat(rows3);
    });
}

关于node.js - NodeJS中promise如何通过多层回调解析所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059338/

相关文章:

javascript - 将 camunda dmn modeler 集成到 spring mvc 应用程序中与 Angular js 前端

node.js - 应用程序引擎 Node.js : how to link app logs and requests logs

Javascript, Promise.then 返回值

javascript - 并行执行多个 promise ,但只从其中一个中检索结果

node.js - 解析域时如何处理 CNAME?

javascript - 如何使用 JavaScript 在 mongodb 中设置唯一 id

Python 模型回调

c++ - 需要使用 shared_ptr 吗?

c++ - 使用成员函数作为回调

javascript - 等到 promise 和 nested then 完成