从NodeJS Async返回值

时间:2015-02-10 06:36:37

标签: node.js asynchronous pusher

我在Node中遗漏了一些简单的东西,我有一个需要导出的函数,并返回一个值async。我不确定如何让Node在返回值之前“等待”,我显然被前端javascript和数据绑定所破坏......

下面的代码不会等待用户将数据恢复(推送器是休息呼叫),因此它总是未定义。

exports.getMembers = function(channel) {
    var users;
    pusher.get( { path: '/channels/'+channel+'/users', params: {} },
            function( error, request, response ) {
                if( response.statusCode === 200 ) {
                    var result = JSON.parse( response.body );
                    users = result.users;
                    return users;
                }
                else {
                    console.log(error);
                }
            }
    );
        //return users;
};

1 个答案:

答案 0 :(得分:3)

我认为这只是对异步如何工作的一个基本误解。根据您在“等待”期后想要发生的事情,有几种方法可以解决这个问题。在你打电话给 getMembers 之后,我不知道你想要采取什么行动,但为了论证,我们只是简单地使用控制台消息。

方法1:Error-First Callbacks

module.exports.getMembers = function(channel, callback) {

  pusher.get( { path: '/channels/'+channel+'/users', params: {} },
        function( error, request, response ) {
            if( !error && response.statusCode === 200 ) {
                var result = JSON.parse( response.body );
                //found our users, return them as 2nd param
                return callback(null, result.users);
            }
            else {
                //something went wrong, fail out
                return callback(error);
            }
        });

}

用法:

var getMembers = require('mymodule').getMembers;

getMembers('#channelNum', function(err, results) {
   if(err) return console.error(err);
   console.log('Found %s users', results.length);
});

方法2:Promises

这是我在处理异步时的个人选择,因为我觉得它更干净。我正在遗漏代码以保持这篇文章的简短。