我有一个父函数,它有多个回调,需要将最里面的回调结果传递给调用这个“父”函数的函数。由于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;
});
});
}
我希望能够将此回调返回给调用者函数。
答案 0 :(得分:1)
让addNewUser
接受回调作为其最后一个参数,让最里面的函数用值调用回调。
或者,您可以考虑让addNewUser
返回一个承诺。 RSVP
或Q
是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
});