2015-11-06 129 views
0

我使用Async来调用一个函数,在该函数中它异步调用db并获取一些值,然后将该值返回给async.series。但是,我怎样才能将该值作为外部函数的return值?如何在内部函数异步执行某些操作时从外部函数的回调中返回值

有关更多信息,请参阅下面代码中的注释。

getUserObjFromDb = function(username, cb) { 
    var user = {}; 
    async.series([ 
      function(callback){ 
       var userObj = callDb(username); 
       callback(null, userObj); 
      } 
     ], 
     function(err, results){ 
      user = results[0]; 
      cb(user); 
     }); 
} 

var theUser = getUserObjFromDb(username, function(user){ 
    return user; 
}); // theUser is undefined because the outer function getUserObjFromDb did not return anything even though its callback returned, it was only the callback of the async.series which returned. 

我怎样才能得到内部传递到theUser的的user价值?

我可以做所有这些完全错误,可能会有一个更简单的方法,所以任何帮助,将不胜感激。 谢谢。

+0

有没有返回声明我看到getUserObjFromDb – Vivek

回答

1

老实说,我并不清楚这个问题。我猜你期待getUserObjFromDb返回回调函数返回的值。 如果是的话,试试这个:

getUserObjFromDb = function(username, cb) { 
     var user = {}; 
      return async.series([ 
        function(callback){ 
         var userObj = callDb(username); 
         return callback(null, userObj); 
        } 
       ], 
       function(err, results){ 
        user = results[0]; 
        cb(user); 
       }); 
     } 
+0

这是完美的。我认为这应该只是工作。也就是说,因为我们正在返回异步的结果,我可以没有回调getUserObjFromDb,而是直接从异步回调中返回用户吗?那会有用吗? getUserObjFromDb =函数(用户名){ var user = {}; 返回async.series([ 函数(回调){ VAR userObj = callDb(用户名); 返回回调(NULL,userObj); } ], 功能(ERR,结果){ 用户=结果[0 ]; 返回用户; }); } –

+0

您只能返回一个值。返回回调(null,userObj);或返回结果[0]; – Vivek

+0

分配'var user = {};'或'user = results [0];'没有明显的好处。 'cb(results [0]);'没有预期的效果? –

1

您在这里混合了同步和异步模式。函数调用getUserObjFromDb正在执行,并且由于异步调用没有完成,所以不能从该函数返回它的值。

这就是为什么回调是必要的。任何需要用户价值的代码都需要通过回调来触发。

相关问题