索引 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));
});
我正在尝试使用 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));
});