我想初始化请求获取ID列表,然后请求每个ID,并将JSON结果存储在数组中。以下是代码基础知识:
request(options, function(err, resp, body){
ids = (JSON.parse(body))[ids];
results=[];
for(id in ids){
options.path='/api/example/' + ids[id];
request(options, function(err, resp, body){
results.push(JSON.parse(body));
})
}
res.send(results);
})
当我运行它时,结果仍然是一个空数组,当我在内部请求函数中放入res.send(结果)时,它只捕获一个结果,而不是所有结果。有什么想法吗?
答案 0 :(得分:1)
大多数NodeJS操作都是异步的。如果某个函数需要回调,则意味着无法保证在调用它之后您将获得结果。
使用for
循环执行N个请求时,您将启动N个异步操作,并且当底层异步操作结束时,将调用每个回调。
这里有很多选择来解决这个问题。
例如,you can use Q,Promise pattern实现,将异步承诺排入队列并等待,直到所有问题都已解决:
request(options, function(err, resp, body){
// First of all, you create a deferred object
var deferred = Q.defer();
// Also, you create an array to push promises
var promises = [];
ids = (JSON.parse(body))[ids];
results=[];
for(id in ids){
options.path='/api/example/' + ids[id];
// You create a promise reference, and later
// you add it to the promise array
var promise = deferred.promise;
promises.push(promise);
request(options, function(err, resp, body){
results.push(JSON.parse(body));
// whenever an async operation ends, you resolve its promise
deferred.resolve();
})
}
// Now you wait to get all promises resolved (i.e. *done*), and then your
// "results" array will be filled with the expected results!
Q.all(promises).then(function() {
res.send(results);
});
});