从 NodeJS 异步返回值

Returning values from NodeJS Async

我在 Node 中遗漏了一些简单的东西,我有一个函数需要导出,return 一个值,异步。我不确定在 return 值之前如何在 Node 中拥有它 "wait",我显然被前端 javascript 和数据绑定宠坏了...

下面的代码不会等待用户取回数据(pusher 是一个 rest call)所以它总是未定义的。

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;
};

我认为这只是对异步工作原理的根本误解。根据您希望在 "wait" 期间之后发生什么,您可以采用多种方法来解决这个问题。我不知道你在调用 getMembers 后想要执行什么操作,但为了论证,我们只使用控制台消息。

方法一: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);
});

方法二:Promises

这是我在处理异步时的个人选择,因为我觉得它更干净。我省略了代码以保持 post 简短。