Nodejs回调问题

时间:2013-06-27 09:13:45

标签: node.js asynchronous callback

我正在构建一个小应用程序,需要对外部API进行多次HTTP调用,并将结果合并到一个对象或数组中。 e.g。

  1. 连接到端点并获取身份验证密钥 - 将身份验证密钥传递给步骤

  2. 获取可用项目摘要列表项目 - 使用auth密钥连接到端点并获取JSON结果 - 创建包含摘要结果的对象并转到步骤3.

  3. 迭代传递的对象摘要结果并为对象中的每个项调用API以获取每个摘要行的详细信息 - 然后创建包含摘要和详细信息的单个JSON数据结构。

    < / LI>

    使用nodejs异步库我可以到第2步,但是因为第3步涉及多个HTTP请求,每个请求都有自己的回调,我在回调地狱中迷路了。

    是否建议使用节点轻松处理此类用例?

2 个答案:

答案 0 :(得分:1)

处理多个回调并不容易。但是,已经存在可以帮助您的库,例如Caolan's async.js。解决方案可能如下:

var async = require("async");

var myRequests = [];

myArray.forEach(function(item) {
    myRequests.push(function(callback) {
        setTimeout(function() {
            // this only emulates the actual call
            callback(result);  
        }, 500);
    });
});

async.parallel(myRequests, function(results) {
    // this will fire when all requests finish whatever they are doing
});

答案 1 :(得分:0)

一个简单的解决方案是计算回调:

var results = [];

function final_callback(results)

function callback(result){
  results.push(result):
  if (results.length == number of requests){
    final_callback(results);
  }
}

更合适的解决方案是使用带事件的事件EventEmitter:

my_eventEmitter.on('init_counter',function(counter){
    my_eventEmitter.counter=counter;
});
my_eventEmitter.on('result',function(result){
    if( my_eventEmitter.counter == 0 ) return;
    //stop all callbacks after counter is 0;
    my_eventEmitter.results.push(result);
    my_eventEmitter.counter--;
    if( my_eventEmitter.counter == 0 ){
        my_eventEmitter.emit('final_callback');
    }
});
my_eventEmitter.on('final_callback', function(){
   //handle my_eventEmitter.results here
})

.... 现在你只需要做它,但是在它发送init_counter到事件发射器之前

my_eventEmitter.emit('init_counter',50);
for(i=0; i<50; i++) async_function_call(some_params, function(result){
    my_eventEmitter.emit('result',result);
});