我对javascript和回调没问题,但我对此非常恼火,需要调用stackoverflow的世界寻求帮助。
我编写了一个函数,用于以下方式:
var meth = lib.funcTion(a,b); // meth should hold an array of properties { c, d } once executed
所以现在在lib.js中,我们有一个像:
这样的结构exports.funcTion = function (a,b) {
database.connect(params, function(err,get){
get.query(querylang, function(err, results){
var varsIwantToReturn = { var1: results[i].foo, var2: results[i].bar };
});
});
// Now how do i return 'varsIwantToReturn'?
};
我已经看到了将callback()合并到函数中的一些事情,但我不确定这是如何工作的。我也看到有些人使用exec() - 再次,我不确定如何或为什么使用它。
请提前帮助:)。
答案 0 :(得分:1)
嗯,这都是异步的,所以如果你试图返回它 - 它将返回undefined。在JavaScript中(没有新的yield
关键字)函数同步执行从上到下。当您像数据库调用一样进行IO调用时 - 它仍然会同步执行。事实上,当varIwantToReturn
获得人口时,该功能已经长期运行并终止。
剩下的就是像database.connect
和get.query
这样的异步函数做同样的事情并让函数接受回调:
exports.function = function (a,b, callback) {
database.connect(params, function(err,get){
if(err) return callback(err, null); // don't suppress errors
get.query(querylang, function(err, results){
if(err) return callback(err, null); // don't suppress errors
var varsIwantToReturn = { var1: results[i].foo, var2: results[i].bar };
callback(null, varsIwantToReturn);
});
});
};
然后你会把它称为
myExportedFunction(myA,myB, function(err, resp){
if(err) recoverFromError(err);
// varsIWantToReturn are contained in `resp`
});