Node.js 从嵌套回调而不是父函数返回值

Node.js 从嵌套回调而不是父函数返回值,node.js,asynchronous,callback,Node.js,Asynchronous,Callback,我有一个具有多个回调的父函数,需要将最内层回调的结果传递给调用此“父”函数的函数。由于NodeJS是异步的,我的父函数显然总是在执行回调之前返回 我怎样才能使我的回拨返回给打电话的人 我现在正在使用的代码示例- var addNewUser = function(hash,name,number,time,syncTime){ // check here if the user exists or not by querying the phone number first connectio

我有一个具有多个回调的父函数,需要将最内层回调的结果传递给调用此“父”函数的函数。由于NodeJS是异步的,我的父函数显然总是在执行回调之前返回

我怎样才能使我的回拨返回给打电话的人

我现在正在使用的代码示例-

var addNewUser = function(hash,name,number,time,syncTime){

// check here if the user exists or not by querying the phone number first
connection.query('SELECT user_id FROM users WHERE user_phone_number ="' +number+'"',function(err,rows,fields){

    if(rows[0]) return false;

    connection.query('INSERT INTO users (authorization_hash,user_name,user_phone_number,user_local_time,is_active,last_synced) VALUES ("'+hash+'","'+name+'","' + number+'","' +time+'","1","'+syncTime+'")',function(err,rows,fields){
    if(err) throw err;

    return true;    
        });

});
}

我希望能够将此回调返回给调用方函数。

Have
addNewUser
接受回调作为其最后一个参数,并让最里面的函数使用值调用回调

或者,您可以考虑让
addNewUser
返回一个承诺
RSVP
Q
是承诺的实现/A:

function addNewUser(hash,name,number,time,syncTime) {
    var deferred = Q.defer();
    connection.query("SELECT ...", function(err, rows, fields) {
        if(err) { deferred.reject(err); }
        if(rows[0]) { deferred.reject("some reason"); }
        connection.query("INSERT INTO ...", function(err, rows, fields) {
            if(err) { deferred.reject(err); }
            deferred.resolve(rows[0]); // Whatever addNewUser would return normally
        });
    });

    return deferred.promise;
}
然后调用者会这样使用它:

addNewUser(...).then(function(newUserAdded) {
    // Do something with newUserAdded here
}, function(err) {
    // Do something with the error here
});

与实际问题无关,但示例代码存在问题,因为在
INSERT
创建竞争条件之前,通过
SELECT
查询检查用户是否存在。查看
插入到。。。使用重复键…
或DB的等效键。感谢您指出这一点!INSERT IGNORE是否等效(我知道它会将所有错误都作为警告)。我脑子里刚出现一个问题,为什么我会遇到竞争条件,因为要插入的查询在回调中,并且总是在select查询完成后调用它。请让我知道,如果我缺少一个基本的在这里。用户a选择。。。不返回任何行。用户B选择。。。不返回任何行。用户插入。。。成功插入。用户B插入。。。失败。在这种情况下,您可能可以检查从用户B的INSERT语句返回的错误,但最好使用原子INSERT语句来为您进行检查。我最终将回调作为参数传递给函数,它的工作方式与我希望的完全相同!我还意识到,从根本上说,我不能从回调返回值。