从嵌套的callback而不是父函数返回值

我有一个父函数有多个callback,需要将最里面的callback的结果传递给调用这个“父”函数的函数。 由于NodeJS是asynchronous的,我的父function显然总是在callback执行之前返回。

我怎样才能使我的callback回到调用者?

我正在使用的代码示例 –

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

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

addNewUser接受一个callback作为它的最后一个参数,并让最内层​​的函数调用具有该值的callback函数。

或者,您可以考虑让addNewUser返回一个承诺。 RSVPQ是Promises / 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 });