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

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

});
}

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

最佳答案

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

或者,您可以考虑让 addNewUser 返回一个 promise 。 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
});

关于node.js - 从嵌套回调而不是父函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18177357/

相关文章:

javascript - 为什么 Node (Javascript)中缺少分号不会引发错误?

javascript - Node JS 请求阻塞其他请求

node.js - Express session 和 PassportJS 之间的区别

c++ - 使用友元类隐藏私有(private)静态回调方法

mysql - 如何在移动到下一行之前选择然后插入到同一行

Javascript Promise 对象无法与 Promise.all 异步工作

javascript - 检查文件是否存在,如果存在则返回

ios - CoreData 完成后 Swift iOS 9 UITableView 重新加载数据

Android 上的 Java 接口(interface)回调

c++ - SQLite 的 sqlite3_exec 和回调作为类成员