【问题标题】:Returning values from NodeJS Async从 NodeJS 异步返回值
【发布时间】:2015-02-10 06:36:37
【问题描述】:

我在 Node 中缺少一些简单的东西,我有一个需要导出的函数,并返回一个值,异步。我不确定如何在 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;
};

【问题讨论】:

  • 您需要使用回调。请参阅关于客户端 Ajax 的 this answer,但异步概念是相同的,它解释了将异步值传递给其他代码的各种选项。

标签: node.js asynchronous pusher


【解决方案1】:

我认为这只是对异步工作原理的基本误解。有几种方法可以解决这个问题,具体取决于您希望在“等待”期之后发生什么。我不知道您在调用 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

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

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多