具有一个响应的多个回调-Node JS

Multiple Call backs with one response -Node JS

本文关键字:回调 -Node JS 有一个 响应 具有一      更新时间:2023-11-06

我从客户端收到一个请求,该请求需要从两个表中选择数据,从一个表中我需要在表2中选择1000条记录,我只需要选择两条记录,通过回调处理。我想要两个回调函数执行后需要发送给我的客户端的响应,如何在node js中实现这一点?

您有以下选项:

  1. 遵循Node样式的回调模式。另请阅读,回调地狱
  2. 遵守承诺

回调模式

var f  = function(somedata, cb){
    // pick user from db
    pickUserFromTable1(somedata, function(err, users){
        // callled on completion of pickUserFromDB
        if(err){
            //handle error.
            cb(err, null);
            return;
        }
        pickUserFromTable2(users, function(err, finallySelectedUsers){
            // called on completion of pickUserFromTable2
            if(err){
                // handle error.
                cb(err, null);
                // returning is important. or use else part of if to separate the case
                return;
            }
            // call initiator's callback function on completion of both pickUserFromTable1 and pickUserFromTable2
            cb(null, finallySelectedUsers);
        });
    })
}

注意:这种方法适用于短项目,但如果依赖链很长,则会导致一些维护问题(回调地狱)。

欢迎来到回调地狱!你只需要建立吡喃酰胺形式的回调!

示例:

function getDataFromDB (query, successCb, errorCb) {
    executeFirstQuery(query, function(firstQueryData) {
        console.log('First query ok! Now execute second.');
        executeSecondQuery(query, function(secondQueryData) {
            console.log('Second query ok! Now execute successCb().');
            successCb([firstQueryData, secondQueryData]);
        }, function(error) {
            errorCb("Error in second query");
        })
    }, function(error) {
        errorCb("Error in first query");
    });
}
function executeFirstQuery (query, successCb, errorCb) {
    console.log("Execute first query!");
    successCb("Some data from first query");
    // errorCb("Some Error from first query");
}
function executeSecondQuery (query, successCb, errorCb) {
    console.log("Execute second query!");
    successCb("Some from second query");
    // errorCb("Some Error from second query");
}
getDataFromDB("Some sql", function(data) {
    console.log(data);
}, function(error) {
    console.error(error);
});

或者使用承诺:http://documentup.com/kriskowal/q/