6

これが私がやりたいことです

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 (約束の方法)

4

3 に答える 3

3

それはできません。非同期関数が完了するまで待つ必要があります。

Florent's answer に記載されているように、自分で何かを作成するか、非同期ミドルウェアを使用するか、組み込み機能を使用することができますが、とにかくここに他の2つを追加します:

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);
       }
   });
});
于 2013-12-20T15:11:19.437 に答える