返回请求循环的结果

时间:2014-12-31 18:45:01

标签: node.js

我想初始化请求获取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(结果)时,它只捕获一个结果,而不是所有结果。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

大多数NodeJS操作都是异步的。如果某个函数需要回调,则意味着无法保证在调用它之后您将获得结果。

使用for循环执行N个请求时,您将启动N个异步操作,并且当底层异步操作结束时,将调用每个回调。

这里有很多选择来解决这个问题。

例如,you can use QPromise 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);
 });
});