0

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

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

  2. 获取可用项目的摘要列表项目 - 使用身份验证密钥连接到端点并获取 JSON 结果 - 创建一个包含摘要结果的对象并传递到步骤 3。

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

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

有没有推荐的方法来使用节点轻松处理这种类型的用例?

4

2 回答 2

1

处理多个回调并不容易。但是已经有一些库可以帮助你,比如Caolan 的 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
});
于 2013-06-27T09:19:00.130 回答
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
})

....现在你只需要做你的 for 但在它发送 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);
});
于 2013-06-27T12:04:32.670 回答