从javascript中的多个回调中的变量中提取数据

时间:2014-08-18 06:03:56

标签: javascript node.js callback

我对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() - 再次,我不确定如何或为什么使用它。

请提前帮助:)。

1 个答案:

答案 0 :(得分:1)

嗯,这都是异步的,所以如果你试图返回它 - 它将返回undefined。在JavaScript中(没有新的yield关键字)函数同步执行从上到下。当您像数据库调用一样进行IO调用时 - 它仍然会同步执行。事实上,当varIwantToReturn获得人口时,该功能已经长期运行并终止。

剩下的就是像database.connectget.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`
});