我正在尝试每周在解析时运行这个云工作,我根据他们的高分为玩家分配排名。这段代码似乎大部分工作,只是它只设置从1到9的等级。任何超过一位数的东西都不会被设置! 在从1-9设置排名后,作业返回成功。
Parse.Cloud.job("TestJob", function(request, status)
{
Parse.Cloud.useMasterKey();
var rank = 0;
var usersQuery = new Parse.Query("ECJUser").descending("HighScore");
usersQuery.find(function(results){
for(var i=0;i<results.length;++i)
{
rank += 1;
console.log("Setting "+results[i].get('Name')+" rank to "+rank);
results[i].save({"Rank": rank});
}
}).then(function(){
status.success("Weekly Ranks Assigned");
}, function(error){
status.error("Uh oh. Weekly ranking failed");
})
})
在控制台日志中,它清楚地说“将playerName排名设置为11”,但它实际上并没有在解析表中设置任何内容。只是未定义(或之前的任何内容)。
代码看起来是否合适?我错过了与javascript相关的东西?
根据答案更新: 显然我不是在等待工作完成。但我不知道如何编写处理承诺的代码。这就是我所拥有的:
var usersQuery = new Parse.Query("ECJUser").descending("HighScore");
usersQuery.find().then(function(results)
{
var promises = [];
for(var i=0;i<results.length;i++)
{
promises.append(results[i].save({"Rank":rank}));
}
return promises;
})
我如何处理承诺清单?我在哪里等他们完成?
答案 0 :(得分:0)
您的代码不会等待保存完成,因此会产生不可预测的结果。它也不会遍历所有用户,只是查询返回的第一个“页面”。
因此,您应该考虑使用find
而不是each
。您还需要考虑作业是否有时间处理所有用户,并且可能需要多次运行。
对于保存,您应该添加返回到数组的每个promise,然后wait以便在调用status.success
之前完成所有承诺。