Javascript 具有一个响应的多个回调-节点JS

Javascript 具有一个响应的多个回调-节点JS,javascript,node.js,callback,Javascript,Node.js,Callback,我从客户端收到一个请求,该请求需要从两个表中选择数据,从一个表中我需要选择1000条记录,在表2中我只需要选择两条记录,并通过回调进行处理。我想要两个回调函数执行后需要发送到客户端的响应,如何在NodeJS中实现这一点 欢迎来到地狱!您只需要构建金字塔形回调 例如: function getDataFromDB (query, successCb, errorCb) { executeFirstQuery(query, function(firstQueryData) {

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

欢迎来到地狱!您只需要构建金字塔形回调

例如:

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);
});

或者使用承诺:

您有以下选项:

  • 遵循节点样式的回调模式。还读到,
  • 跟着
  • 回调模式

    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);
            });
        })
    }
    

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

    谢谢你的回复。但我怀疑的是节点js是非阻塞的,所以第二个查询依赖于一个查询来执行,看起来像是阻塞知道吗?如果我错了,请纠正我,我只需要使用单回拨来简化查询。我想我误解了您的问题,如果您希望并行运行两个查询,并且希望在完成这两个查询后生成输出。然后,异步库并行方法将帮助您。