我正在构建一个小应用程序,需要对外部API进行多次HTTP调用,并将结果合并到一个对象或数组中。 e.g。
连接到端点并获取身份验证密钥 - 将身份验证密钥传递给步骤
获取可用项目摘要列表项目 - 使用auth密钥连接到端点并获取JSON结果 - 创建包含摘要结果的对象并转到步骤3.
迭代传递的对象摘要结果并为对象中的每个项调用API以获取每个摘要行的详细信息 - 然后创建包含摘要和详细信息的单个JSON数据结构。
< / LI> 醇>使用nodejs异步库我可以到第2步,但是因为第3步涉及多个HTTP请求,每个请求都有自己的回调,我在回调地狱中迷路了。
是否建议使用节点轻松处理此类用例?
答案 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);
});