Node.js:如何避免在循环内的Node.js中进行异步调用?

时间:2018-06-26 05:42:03

标签: node.js async-await

在这里,我需要两次从数据库中获取数据,并将结果作为响应返回。

但是我的问题是从数据库中获取数据之前,调用了响应函数,它将返回空响应

这是我的代码:

Stages.findById(comp.currentStage.stage, function(stgErr, stageName) {

    if (stgErr) {
        res.json(HttpStatus.INTERNAL_SERVER_ERROR, usrErr);
        return;
    }

    comp.currentStageName = stageName.name;
    components.push(comp);

    ServiceProviderUser.findById(comp.currentStage.user, function(
      usrErr,
      userName
    ) {
        if (usrErr) {
            res.json(HttpStatus.INTERNAL_SERVER_ERROR, usrErr);
            return;
        }
        comp.personResponsible = userName.firstName + " " + userName.lastName;
        components.push(comp);
        console.log("1111111111", comp);
    });

    checkCondition(); //check condition is the function for response send
});

function checkCondition() {
    res.json(HttpStatus.OK, components);
}

1 个答案:

答案 0 :(得分:0)

只需在发送数据库调用的回调中移动返回函数调用

Stages.findById(comp.currentStage.stage, function (stgErr, stageName){
        if (stgErr) {
            res.json(HttpStatus.INTERNAL_SERVER_ERROR, usrErr);
            return;
        }
        comp.currentStageName = stageName.name;
        components.push(comp);
        ServiceProviderUser.findById(comp.currentStage.user, function (usrErr, userName){
            if (usrErr) {
                res.json(HttpStatus.INTERNAL_SERVER_ERROR, usrErr);
                return;
            }
            comp.personResponsible = userName.firstName+ ' '+userName.lastName;
            components.push(comp);
            console.log("1111111111",comp);

            checkCondition() //moved in callback of this DB call
        })       

})

function checkCondition() {
    res.json(HttpStatus.OK, components);
}

但这不是一个好方法。您可以使用“ Promises”更好地处理异步代码。 我发现this是对诺言的最好解释。希望能帮助到你 !!