解析云作业集()函数怪异

时间:2015-12-29 08:46:13

标签: parse-platform

我正在尝试每周在解析时运行这个云工作,我根据他们的高分为玩家分配排名。这段代码似乎大部分工作,只是它只设置从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;
		
	})

我如何处理承诺清单?我在哪里等他们完成?

1 个答案:

答案 0 :(得分:0)

您的代码不会等待保存完成,因此会产生不可预测的结果。它也不会遍历所有用户,只是查询返回的第一个“页面”。

因此,您应该考虑使用find而不是each。您还需要考虑作业是否有时间处理所有用户,并且可能需要多次运行。

对于保存,您应该添加返回到数组的每个promise,然后wait以便在调用status.success之前完成所有承诺。