2016-03-24 15 views
0

結果セットから反復処理する必要があります。私は動作するコードを持っていますが、何か間違っていると思います。このようにしてはいけません。 私はこれがブロックコードであると感じています。sequlize結果セット内で反復する

projects.forEach(function (res) { 
       projectList.push(res.dataValues.PartId); 
      }); 

をしてから、このコードは、別のクエリとして実行されます:

models.Project.findAll({ 
      where: {ProjectId: projectId} 
     }) 
     .then(function (projects) { 
      //Iteration is here 
      var projectList = []; 
      projects.forEach(function (res) { 
       projectList.push(res.dataValues.PartId); 
      }); 
      //then bulk lookup for the result 
      models.Customers.findAll({ 
       where: {'id': {in: [projectList]}} 
      }).then(function (customers) { 
       reply(customers).code(200); 
      }, function (rejectedPromiseError) { 
       reply(rejectedPromiseError).code(401); 
      }); 

      //reply(sameparts).code(200); 
     }, function (rejectedPromiseError) { 
      reply(rejectedPromiseError).code(401); 
     }); 

この反復部分が行われます。

models.Customers.findAll({ 
       where: {'id': {in: [projectList]}} 
      }).then(function (customers) { 
       reply(customers).code(200); 
      }, function (rejectedPromiseError) { 
       reply(rejectedPromiseError).code(401); 
      }); 

私はそれをどのようにrearangeでき これは動作するコードですそれは約束を使用しますか?

EDIT(可能な解決策): 少し遊んだ後、私は約束を果たしたと信じています。

getAll: function (request, reply) { 
    var projectId = request.params.projectid; 

    var promises = []; 
    var post; 

    models.SamePart.findAll({ 
      where: {ProjectId: projectId} 
     }) 
     .then(function (sameparts) { 
      //Iteration is here     
      sameparts.forEach(function (res) { 
       promises.push(
        Promise.all([    
         models.Parts.findAll({where: {id: res.dataValues.PartId}}) 
        ])) 
      }); 
      //Bulk lookup for the parts that were marked as identical 

      return Promise.all(promises); 
     }).then(function (completepartslist) { 
     reply(completepartslist).code(200); 
    }); 

これは正しい方法ですか? completepartslistには、Promiseのような多くの不要なオブジェクトが含まれているようです。どのように私はそれを平らにすることができますので、複雑なループを避けるために?

答えて

1

.then()を使用している場合は、おそらく約束を使用しています。

オリジナルのコードはブロックされていません。それが簡素化すべきであるように

あなたの最終getAll()はなります。しかし、あなたが後ろにエラー処理を追加する必要があります

getAll: function (request, reply) { 
    models.SamePart.findAll({ 
     where: { ProjectId: request.params.projectid } 
    }).then(function (sameparts) { 
     return Promise.all(sameparts.map(function (res) { 
      return models.Parts.findAll({ where: { id: res.dataValues.PartId } }); 
     })); 
    }).then(function (completepartslist) { 
     reply(completepartslist).code(200); 
    }); 
} 

+1

をリファクタリングしていただきありがとうございます確認 :) –

1

さらに簡略化

getAll: function (request, reply) { 
    models.SamePart.findAll({ 
     where: { ProjectId: request.params.projectid } 
    }).reduce(function (completepartslist, sameparts) { 
     return models.Parts.findAll({ where: { id: sameparts.PartId } }). 
      then(function(res){ 
      completepartslist.concat(res) 
      }); 
     }), []); 
    }).then(function (completepartslist) { 
     reply(completepartslist).code(200); 
    }); 
}