如何处理循环中的promise?

时间:2013-12-20 14:58:43

标签: node.js promise sails.js q waterline

这就是我想做的事情

var response = [];

Model.find().then(function(results){
   for(r in results){
      MyService.getAnotherModel(results[r]).then(function(magic){
          response.push(magic);
      });          
   }
});

//when finished
res.send(response, 200);

然而它只返回[],因为异步的东西还没有准备好。我正在使用使用Q promise的sails.js。任何想法如何在所有异步调用完成后返回响应?

https://github.com/balderdashy/waterline#query-methods(承诺方法)

3 个答案:

答案 0 :(得分:6)

由于水线使用 Q ,您可以使用allSettled方法 您可以找到more details on Q documentation

Model.find().then(function(results) {
  var promises = [];
  for (r in results){
    promises.push(MyService.getAnotherModel(results[r]));
  }

  // Wait until all promises resolve
  Q.allSettled(promises).then(function(result) {
    // Send the response
    res.send(result, 200);
  });
});

答案 1 :(得分:3)

你根本做不到,你必须等待异步函数完成。

你可以自己创建一些东西,或者使用async中间件,或使用内置功能,如Florent的回答中所述,但我还是会在这里添加其他两个:

var response = [];

Model.find().then(function(results){
   var length = Object.keys(results).length,
       i = 0;
   for(r in results){
      MyService.getAnotherModel(results[r]).then(function(magic){
          response.push(magic);
          i++;
          if (i == length) {
              // all done
              res.send(response, 200);
          }
      });     
   }
});

或使用async

var response = [];

Model.find().then(function(results){
   var asyncs = [];
   for(r in results){
       asyncs.push(function(callback) {
           MyService.getAnotherModel(results[r]).then(function(magic){
               response.push(magic);
               callback();
           })
       });
   }
   async.series(asyncs, function(err) {
       if (!err) {
           res.send(response, 200);
       }
   });
});

答案 2 :(得分:-3)

看看jQuery延迟对象:
http://api.jquery.com/category/deferred-object/

具体来说,.when()
http://api.jquery.com/jQuery.when/