我正在 Parse 上运行云代码。我正在运行一个查询,对于每个查询,我正在执行一个子查询。我将修改子查询的结果。但是修改了我的子查询对象后,我想修改我的查询结果对象以反射(reflect)我已经处理了它们。
使用 Promise,我可以进行初始查询、迭代每个结果、使用该结果执行子查询并修改新的子查询结果。但是,一旦我成功保存子查询结果,就不会调用保存回调,并且我无法更新初始查询对象。
Parse.Cloud.job("processEvents", function(request, status){
Parse.Cloud.useMasterKey();
var query = new Parse.Query("events");
query.equalTo("processed", false);
query.limit(10);
query.find().then(function(results) {
var promise = Parse.Promise.as();
_.each(results, function(eventsRecord) { //EACH
var eventData = eventsRecord.get("eventData");
var eventsObject = JSON.parse(eventData);
var events = eventsObject["events"];
for (var i = 0; i < events.length; i++) { //FOR
var currentEvent = events[i];
if(currentEvent["type"] === "vote"){
var votes = currentEvent["entity"]["votes"];
for (var i = 0; i < votes.length; i++) {
var currentVote = votes[i];
promise = promise.then(function() {
var EventAssociationObject = Parse.Object.extend("eventAssociation");
var query = new Parse.Query(EventAssociationObject);
query.equalTo("voteID", currentVote["id"]);
return query.first({
success:function(object){
var partyEntity = currentEvent["entity"];
object.set("entityJSONInformation", JSON.stringify(partyEntity));
//object in the response callback must be the object saved
return object.save(object, {
success:function(object){
eventsRecord.set("processed", true);
return eventsRecord.save();
},
error: function(error){
console.log(error);
}
});
},
error:function(error){
console.log(error);
}
});
});
};
}
}; //FOR
}); //EACH
return promise;
}).then(function() {
status.success("Finished");
});
});
最佳答案
当您使用 Parse 的回调机制使用 success:
执行此类操作时,您就逃离了 promise 代码。当您从成功返回时:它不会返回任何有意义的地方,并且不会像 Promise 那样异步等待它。
相反,您应该返回 promise 并链接它们。
query.first({...
应该变成
query.first().then(function(result){
// ...
return result.save();
}).then(function(result){
eventRecords.set(...
return eventsRecord.save();
});
祝你好运,编码愉快:)
关于javascript - 对象保存时未调用解析回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25956366/