2015-02-10 67 views
1

我在Node中缺少一些简单的东西,我有一个需要导出的函数,并返回一个异步值。我不知道如何让节点在返回值之前“等待”,我显然被宠坏了前端的JavaScript和数据绑定...从NodeJS返回值Async

下面的代码将不会等待用户有数据返回(推是一个休息电话),所以它总是未定义的。

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

您将需要使用回调。请参阅[本答案](http://stackoverflow.com/a/14220323/816620),它是关于客户端Ajax的,但异步概念是相同的,并且它解释了为不同的选项获取异步值给其他人码。 – jfriend00 2015-02-10 07:37:52

回答

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

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