我的一个云功能偶尔会超时。尽管在课堂上只有大约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);
}
});
}
});
});
答案 0 :(得分:1)
我认为问题不在您的代码中。与错误消息一样:请求超时。也就是说,Parse API在超时期间没有响应,或者网络导致超时。只要你做.count
,就可能会完成一些API调用,然后无法连接或超时。
显然有更多人遇到此问题:https://www.parse.com/questions/ios-test-connectivity-to-parse-and-timeout-question。似乎没有可能增加超时,因此这篇文章中的建议指出:
出于这个原因,我建议在执行之前设置
NSTimer
查询,并在查询返回时使其无效。如果NSTimer
在失效之前触发,询问用户是否要保留 等待结果回来,或向他们显示一条消息 表明请求需要很长时间才能完成。这个 如果用户知道他们当前的情况,他们就有机会等待更多 网络条件不理想。
如果您正在处理网络,特别是在移动平台上,您需要准备网络连接。所以像帖子建议的那样:为用户提供再次尝试的选项。