从嵌套的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
返回一个承诺。 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 });