Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何处理循环中的承诺?_Node.js_Promise_Sails.js_Q_Waterline - Fatal编程技术网

Node.js 如何处理循环中的承诺?

Node.js 如何处理循环中的承诺?,node.js,promise,sails.js,q,waterline,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,

这就是我想做的

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。您知道如何在所有异步调用完成时返回响应吗


(承诺方法)

看看jQuery延迟对象:

特别是,.when()


由于水线使用Q,因此您可以使用
全部结算方法。
你可以找到


您不能这样做,必须等待异步函数完成

您可以自己创建一些东西,或者使用中间件,或者使用内置功能,如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);
          }
      });     
   }
});
或者使用异步

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);
       }
   });
});

其中a位于node.js上下文中。啊,我的错。。快速查看这就是答案下面的“删除”链接的目的::-)
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);
       }
   });
});