2016-09-05 1 views
0

Я просто изучаю Javascript и все еще довольно новый для облачного кода Parse. Я читал некоторые статьи и вопросы о обещаниях и закрытиях и до сих пор не совсем понимаю, как выполнить то, что я хочу делать. Все остальные вопросы/ответы кажутся немного разными или трудными для понимания.Javascript обещает прикованный внутри Loop

У меня есть функция, которая начинается с запроса, который получает все «Спортивные залы». Для каждого из этих спортзалов мне нужно запустить несколько других запросов. Все эти внутренние запросы (внутри цикла) должны быть заполнены до того, как я смогу создать окончательный отчет для тренажерного зала. Я хочу понять следующие вещи:

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

 Смежные вопросы

  • Нет связанных вопросов^_^