Javascript承诺链接在循环

时间:2016-09-05 04:05:53

标签: javascript for-loop parse-platform promise parse-server

我只是在学习Javascript,对Parse的云代码来说还是一个新手。我一直在阅读有关承诺和封闭的一些文章和问题,但仍然不太了解如何完成我想做的事情。所有其他问题/答案似乎略有不同或难以理解。

我有一个以获取所有“健身房”的查询开头的函数。对于每个健身房,我需要运行其他几个查询。在我为健身房生成最终报告之前,所有这些内部查询(在循环内)都需要完成。我想了解以下事项:

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 个答案:

答案 0 :(得分: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);
        });
}