索引 Javascript 解析 Promise 循环

Indexed Javascript Parse Promise Loops

我正在尝试使用 class 1 给出的值在 class 2 中查找与 class 1 的值相关的更多值。我打算通过循环 k 的值来做到这一点,但是,无论我把循环放在哪里,它似乎只使用 k 的最终值。谁能告诉我在处理承诺时如何处理索引的必要性?我对承诺和解析都不熟悉。编辑:IF 括号错位了。

var Class1 = Parse.Object.extend("Class1");
var Class2 = Parse.Object.extend("Class2");

Parse.Promise.as().then(function () {

  var query = new Parse.Query(Class1);
  return query.find()

  }).then(function (class1IDs) {
    for (var k = 0; k < class1IDs.length; k++) {

      var class1IDEntry = class1IDs[k];
      var class1ID = class1IDEntry.id;

      Parse.Promise.as().then(function () {
        var class1 = new Class1();
        class1.id = class1ID;

        var query = new Parse.Query(Class2); //
        query.equalTo("class1", class1);
        return query.find()

      }).then(function (class2IDs) {
        var stuff;
      });
    }

  }).then(function() {
    done();
  }, function(error) {
    console.log(error);
    done(new Error(error));
  });
});

您想等待 for 循环内创建的所有承诺完成,然后再 done() 正确调用 - 循环内的查询 运行 应该串联还是并行?您遇到的另一个问题是由于代码的异步性质,所有 class1.id = class1ID 都将具有 class1IDs 中最后一项的 class1ID(正如您所怀疑的那样)

运行 通过 class1IDs 串联

var Class1 = Parse.Object.extend("Class1");
var Class2 = Parse.Object.extend("Class2");

Parse.Promise.as().then(function() {
    var query = new Parse.Query(Class1);
    return query.find()
}).then(function(class1IDs) {
    return class1IDs.reduce(function(promise, class1IDEntry) {
        var class1ID = class1IDEntry.id;
        var class1 = new Class1();
        class1.id = class1ID;
        var query = new Parse.Query(Class2); //
        query.equalTo("class1", class1);
        return promise.then(function() {
            return query.find();
        }).then(function(class2IDs) {
            var stuff;
        });
    }, Parse.Promise.as());
}).then(function() {
    done();
}, function(error) {
    console.log(error);
    done(new Error(error));
});

运行 通过 class1IDs 并行

var Class1 = Parse.Object.extend("Class1");
var Class2 = Parse.Object.extend("Class2");

Parse.Promise.as().then(function() {
    var query = new Parse.Query(Class1);
    return query.find()
}).then(function(class1IDs) {
    return Parse.Promise.when.apply(null, class1IDs.map(function(class1IDEntry) {
        var class1ID = class1IDEntry.id;
        var class1 = new Class1();
        class1.id = class1ID;
        var query = new Parse.Query(Class2); //
        query.equalTo("class1", class1);
        return query.find()
        .then(function(class2IDs) {
            var stuff;
        });
    }));
}).then(function() {
    done();
}, function(error) {
    console.log(error);
    done(new Error(error));
});