如何使用NodeJS

时间:2017-09-05 16:11:24

标签: node.js callback promise resolve

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

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,但我不知道所有推送何时完成。所以我不知道何时解决,将数据返回给用户,例如,通过快递中的response.send。至于上面的代码,当我多次使用resolve时,我只会获得返回的整个数据的一部分。

我可以想出两个解决方法,也不好。一种是在setTimeout中包围所有结果,这意味着我必须将响应延迟到用户。

另一个是计算开始时的所有推送时间,每次按下一个项目时减去1。当时间变为0时,请解决。但在进行真正的循环之前,通常很难计算出数字。

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

1 个答案:

答案 0 :(得分:1)

首先,避免使用Promise constructor antipattern并使用返回值!对于多层异步函数,只需使用多层promises。要一次等待多个承诺,请使用Promise.all

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