【问题标题】:Javascript promises chained inside LoopJavascript Promise 链接在 Loop 中
【发布时间】:2016-09-05 04:05:52
【问题描述】:

我刚刚学习 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");
      }
  });
}

【问题讨论】:

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


    【解决方案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);
            });
    }
    

    【讨论】:

    • 这看起来非常棒的人。我今晚要试一试,稍后会接受/评论。感谢您抽出宝贵时间回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2019-01-08
    相关资源
    最近更新 更多