2016-09-05 10 views
0

私はJavascriptを学んでいるだけで、Parseのクラウドコードにはまだかなり新しいです。私は約束や閉鎖に関するいくつかの記事や質問を読んできましたが、まだやりたいことを達成する方法をまだ理解していません。他のすべての質問/答えは少し異なっているか、または理解するのが難しいようです。Javascriptはループ内で連鎖することを約束します

私はすべての「ジム」を取得するクエリから始まる関数を持っています。それらのジムのそれぞれについて、私はいくつかの他のクエリを実行する必要があります。ジムの最終的なレポートを生成するには、それらの内部クエリ(ループ内)をすべて完了する必要があります。私は以下のことを理解したいと思います:

a。)ループの各反復がその繰り返しのクエリのチェーン全体を通してアクセスできるようにする方法。

b。)チェーン内の以前に実行されたクエリの結果はすべて、次のクエリで利用できるようになりますか?例えば最後の関数でnewWorkoutsにアクセスできますか?

function createReports() { 

    var gymQuery = new Parse.Query(Parse.Object.extend("Gym")); 

    gymQuery.find({ 
     success: function(results) { 
      for (var i = 0; i < results.length; ++i) { 
      /* jshint loopfunc: true */ 
       var gym = results[i]; 


       var newWorkoutsQuery = new Parse.Query(Parse.Object.extend("Workout")); 
       newWorkoutsQuery.equals("gym", gym); 

       newWorkoutsQuery.find().then(function(newWorkouts) { 

       var newLogsQuery = new Parse.Query(Parse.Object.extend("WorkoutLog")); 
       newLogsQuery.equals("gym", gym); 
       return newLogsQuery.find(); 

       }).then(function(logsLastWeek) { 
       //Generate final report for gym using data from all above queries. 
       //Need access to gym, newWorkouts, and logsLastWeek 

       }); 
      } 
     }, 
     error:function() { 
      console.log("error"); 
     } 
    }); 
} 

答えて

1

Promise.all()これであなたを助けることができるはずです。

まず、単一ジムのデータを取得する機能を抜け出すのを聞かせて:

function getGymData(gym) { 
    var newWorkoutsQuery = new Parse.Query(Parse.Object.extend("Workout")); 
    newWorkoutsQuery.equals("gym", gym); 

    var newLogsQuery = new Parse.Query(Parse.Object.extend("WorkoutLog")); 
    newLogsQuery.equals("gym", gym); 

    return Promise.all([newWorkoutsQuery.find(), newLogsQuery.find()]) 
     .then(function (results) { 
      return { 
       gym: gym, 
       workouts: results[0], 
       logs: results[1] 
      }; 
     }); 
} 

その後、すべてのジム渡っPromise.all()を使用します。

function createReports() {  
    var gymQuery = new Parse.Query(Parse.Object.extend("Gym")); 

    return gymQuery.find() 
     .then(function (gyms) { 
      return Promise.all(gyms.map(getGymData)); 
     }) 
     .then(function (results) { 
      // results should be an array of objects, each with 
      // the properties gym, workouts, and logs 
     }) 
     .catch(function (error) { 
      console.error(error); 
     }); 
} 
+1

これはすごい男に見えます。私は今夜​​試してみるつもりだが、後でそれを受け入れる/コメントする。それに答える時間をとってくれてありがとう! – NickDK

関連する問題