为什么Parse云代码保存一个对象而不保存另一个对象?

时间:2015-10-07 21:21:19

标签: parse-platform

我是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();
});

任何帮助将不胜感激

问候 拜伦

1 个答案:

答案 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限制只对该用户进行写操作,因此在保存该对象时还需要使用主密钥。