javascript - 对象保存时未调用解析回调

标签 javascript parse-platform promise

我正在 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/

相关文章:

javascript - 在 html5 上检查在线状态的最佳方式

javascript - 如何在 JavaScript 中操作 DOM 中的特定字符?

c# - 如何转换字符串数据:audio/ogg;base64 to file wav in C#

javascript - AngularJS ng-switch 或类似的工具来处理动态值

parsing - 如何在静态方法中将 "promises"转换为 "string"[ts]

javascript - 使用 setTimeout 添加类而不使用 Jquery

ios - 无法在 iPhone 中使用 Swift 连接到 Parse

facebook - 链接 facebook 用户时缺少解析 REST Api 的用户密码

JavaScript:Promise.All() 和 Async/Await 以及 Map()

javascript - React fetch 返回空值