如何在内部函数异步执行某些操作时从外部函数的回调中返回值

时间:2015-11-06 18:11:19

标签: javascript asynchronous callback promise asynccallback

我使用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. 

如何将user内部的值传递给theUser

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

2 个答案:

答案 0 :(得分: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);
                });
        }

答案 1 :(得分:1)

您在这里混合了同步和异步模型。函数调用getUserObjFromDb正在立即执行,并且由于异步调用尚未完成,因此无法从该函数返回它的值。

这就是回调是必要的原因。任何需要用户值的代码都需要由回调触发。