什么会导致parse.com云代码计数“请求超时”?

时间:2015-02-03 08:07:30

标签: javascript parse-platform cloud

我的一个云功能偶尔会超时。尽管在课堂上只有大约700个对象,但计数似乎有问题。我很感激有关如何调试此问题的任何提示。

云功能大部分时间都能正常工作。

记录示例错误:

E2015-02-03T02:21:41.410Z] v199: Ran cloud function GetPlayerWorldLevelRank for user xl8YjQElLO with:
  Input: {"levelID":60}
  Failed with: PlayerWorldLevelRank first count error: Request timed out

下面的代码中有什么看起来很奇怪的东西吗?超时错误通常在第二个计数(query3)中抛出,尽管有时它会在第一个计数(query2)中超时。

Parse.Cloud.define("GetPlayerWorldLevelRank", function(request, response) {    
    var query = new Parse.Query("LevelRecords");
    query.equalTo("owner", request.user);
    query.equalTo("levelID", request.params.levelID);
    query.first().then(function(levelRecord) {
        if (levelRecord === undefined) {
            response.success(null);
        }
        // if player has a record, work out his ranking
        else {
            var query2 = new Parse.Query("LevelRecords");
            query2.equalTo("levelID", request.params.levelID);
            query2.lessThan("timeSeconds", levelRecord.get("timeSeconds"));
            query2.count({
                success: function(countOne) {
                    var numPlayersRankedHigher = countOne;

                    var query3 = new Parse.Query("LevelRecords");
                    query3.equalTo("levelID", request.params.levelID);
                    query3.equalTo("timeSeconds", levelRecord.get("timeSeconds"));
                    query3.lessThan("bestTimeUpdatedAt", levelRecord.get("bestTimeUpdatedAt"));
                    query3.count({
                        success: function(countTwo) {
                            numPlayersRankedHigher += countTwo;
                            var playerRanking = numPlayersRankedHigher + 1;                    
                            levelRecord.set("rank", playerRanking);
                            // The SDK doesn't allow an object that has been changed to be serialized into a response.
                            // This would disable the check and allow you to return the modified object.
                            levelRecord.dirty = function() { return false; };    
                            response.success(levelRecord);    
                        },
                        error: function(error) {
                            response.error("PlayerWorldLevelRank second count error: " + error.message);
                        }                            
                    });
                },
                error: function(error) {
                    response.error("PlayerWorldLevelRank first count error: " + error.message);
                }
            });
         }
    });
});

1 个答案:

答案 0 :(得分:1)

我认为问题不在您的代码中。与错误消息一样:请求超时。也就是说,Parse API在超时期间没有响应,或者网络导致超时。只要你做.count,就可能会完成一些API调用,然后无法连接或超时。

显然有更多人遇到此问题:https://www.parse.com/questions/ios-test-connectivity-to-parse-and-timeout-question。似乎没有可能增加超时,因此这篇文章中的建议指出:

  

出于这个原因,我建议在执行之前设置NSTimer   查询,并在查询返回时使其无效。如果NSTimer   在失效之前触发,询问用户是否要保留   等待结果回来,或向他们显示一条消息   表明请求需要很长时间才能完成。这个   如果用户知道他们当前的情况,他们就有机会等待更多   网络条件不理想。

如果您正在处理网络,特别是在移动平台上,您需要准备网络连接。所以像帖子建议的那样:为用户提供再次尝试的选项。