我是Parse Cloud Code的新手。但是我正在尝试理论上应该直截了当的东西,我无法理解为什么它不起作用!
在我的User类中我有一个playableFriends数组,当我创建一个Game对象时,我希望将玩家和对手从彼此中删除playableFriends Array
从玩家阵列中移除对手的代码有效..但由于某些原因我不知道从对手阵列中移除玩家的代码不会......即使它是唯一正在运行的代码。
我已经将玩家和对手的对象输出到控制台以确保它们存在,我也尝试在对手上使用fetch命令,但这也不起作用
Parse.Cloud.afterSave("Game",function(request, response){
//return if existing game
if (request.object.existed()){
return;
}
//get player
var player = request.object.get("playerIdle");
//get opponent
var opponent = request.object.get("playerTurn");
//remove opponent as playable friend
player.remove("playableFriends", opponent);
//remove player as opponents playable friend
opponent.remove("playableFriends", player);
player.save();
opponent.save();
});
任何帮助将不胜感激
问候 拜伦
答案 0 :(得分:0)
问题是函数末尾的两个保存操作是异步的。基本上,这意味着当达到player.save();
时,即使您的保存操作可能尚未完成,执行仍继续到下一行(在您的情况下,似乎它是第二次保存不是完成)。有几种方法可以克服这个问题:回调和承诺。
回调是传递到异步函数的代码块,该函数将在函数完成时执行。另一方面,承诺允许您在异步函数完成时收到通知。使用promises,您可以使用then()
函数在原始承诺完成后继续执行,如果异步操作成功,则可以解析,如果异步操作返回错误,则可以拒绝。使用promises,函数的最后两行可以按如下方式进行调整:
player.save().then( function(result){
return opponent.save();
}, function (error){
// We had an error saving the player
}).then( function(result){
console.log("Successfully saved user and opponent");
}, function(error){
// We had an error saving the opponent
});
我建议您阅读回调和承诺,因为异步函数是在Parse Cloud Code环境中工作的基本部分。 This blog post将是一个很好的起点。回调可能在短期内更容易理解,但随着应用程序的复杂性增加,可能会导致难以理解和维护的代码。
修改
由于对手用户的ACL限制只对该用户进行写操作,因此在保存该对象时还需要使用主密钥。