2016-06-15 13 views
0

データベースで複数のモデルをクエリしてHTMLでレンダリングする必要がある場合がよくあります。最初のものは戻ってきた後クエリを同時に実行し、すべてのクエリが準備完了した後に返す

  1. 2番目のクエリが実行された:私が行っていること。これは、問題のカップルを持っている

    ModelA.findById({ ... }).then(function(modelA) { 
        ModelB.findById({ ... }).then(function(modelB) { 
         return both modelA and modelB 
        }); 
    }); 
    

    です。彼らはお互いに依存しないので、これは遅れを追加するだけです。クエリは同時に実行する必要があります。

  2. 複数のクエリがある場合、これはかなり面倒です。次

ModelA.findById({ ... }).then(function(modelA) { 
    ModelB.findById({ ... }).then(function(modelB) { 
     ModelC.findById({ ... }).then(function(modelC) { 
      ModelD.findById({ ... }).then(function(modelD) { 
       ModelE.findById({ ... }).then(function(modelE) { 
        ModelF.findById({ ... }).then(function(modelF) { 
         return all models 
        }); 
       }); 
      }); 
     }); 
    }); 
}); 

どのように私は同時にクエリを実行し、すべてのクエリが実行された後にのみ、ページのレンダリングを継続するかを想像してみ?

答えて

1

この場合、Promise.allを使用すると、すべてのクエリが同時に実行されますが、すべてのクエリが返されたときにthen関数が実行されます。

var queries = [ 
    ModelA.findById({...}), 
    ModelB.findById({...}), 
    ModelC.findById({...}), 
    ModelD.findById({...}), 
    ModelE.findById({...}), 
    ModelF.findById({...}) 
]; 

Promise.all(queries).then(function (results) { 
    console.log(results); // [modelA, modelB ...] 
}); 

また、javascriptの約束についてもお読みください。

関連する問題