node.js回调必须是nonce函数吗?如果是这样,为什么?

时间:2017-01-31 22:52:58

标签: node.js callback

我非常努力地模块化我的代码,到目前为止已经完成了避免回调地狱的意愿。令我烦恼的一件事是,当我传入一个回调函数时,它必须从一个nonce回调函数调用,就像这样

paramQuery(query, params, callback){
    this.Handle.getConnection(function(err, Connection){

        Connection.query(query, params, function(error, results, rows){             
            callback(error, results, rows); <-- this crap right here
        });

        Connection.release();
    });
}

是否有必要一直在nonce中调用回调?如果我已经在其他地方定义了回调,为什么我不能将它传递到链上呢?

paramQuery(query, params, callback){
    this.Handle.getConnection(function(err, Connection){
        if(err){
            console.error("Could not connect to the Database:\n\n" + err.stack);
            process.exit(1);
        }

        Connection.query(query, params, callback(error, results, rows)); <-- Much cleaner 

        Connection.release();
    });
}

2 个答案:

答案 0 :(得分:1)

您可以将回调变量(参数)从调用者传递给嵌套函数,而无需声明新函数或执行它。举个简单的例子:

var func1 = function(arg, cb) {
    func2(arg * 100, cb)
}

var func2 = function(arg, cb) {
    cb(arg * 20)
}

func1(4, function(result) {
    console.log(result)
    // 8000
})

您的示例的不同之处在于您正在执行回调(callback()),而不是仅仅将其作为参数传递(callback):

paramQuery(query, params, callback){
    this.Handle.getConnection(function(err, Connection){
        Connection.query(query, params, callback);
        Connection.release();
    });
}

答案 1 :(得分:0)

如果您正在创建的功能和要调用的功能具有相同的签名,那么您不需要包装该功能,您可以自行传递该功能。在你的情况下,它们都是(error, results, rows)所以这将起作用:

paramQuery(query, params, callback){
    this.Handle.getConnection(function(err, Connection){
        if(err){
            console.error("Could not connect to the Database:\n\n" + err.stack);
            process.exit(1);
        }

        Connection.query(query, params, callback);

        Connection.release();
    });
}

如果您按照建议将callback(error, whatever)传递给Connection.query,则会立即调用该函数,并将该函数的结果作为参数传递给Connection.query