我非常努力地模块化我的代码,到目前为止已经完成了避免回调地狱的意愿。令我烦恼的一件事是,当我传入一个回调函数时,它必须从一个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();
});
}
答案 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