并发beforeSave调用允许重复

时间:2016-01-24 16:57:54

标签: javascript parse-platform cloud-code

为了防止创建某些对象,我在该类对象之前设置了一个条件,然后保存了云函数。

但是,当同时创建两个对象时,条件不会相应地起作用。

这是我的代码:

Parse.Cloud.beforeSave("Entry", function(request, response) {
    var theContest = request.object.get("contest");
    theContest.fetch().then(function(contest){
      if (contest.get("isFilled") == true) {
          response.error('This contest is full.');
      } else {
          response.success();
    });
});

基本上,如果比赛已满,我不希望创建一个Entry对象。但是,如果剩余的比赛中有1个点并且同时保存了两个条目,则它们都会被添加。

我知道这是一个边缘案例,但却是一个合理的问题。

2 个答案:

答案 0 :(得分:0)

Parse正在使用Mongodb,这是一个NoSQL数据库,旨在提供可扩展性,因此提供有限的同步功能。你真正需要的是互斥,遗憾的是foo_cont f1; f1.add_element(10); int a = f1.get_foo_vector()[0].get_bar(); 字段不支持互斥。但是,Parse为计数器和数组字段提供原子性,您可以使用它来强制执行某些控制。

参见http://blog.parse.com/announcements/new-atomic-operations-for-arrays/https://parse.com/docs/js/guide#objects-updating-objects

答案 1 :(得分:0)

通过使用递增来解决这个问题,然后在保存回调中进行检查(而不是获取对象并检查其上的布尔值)。

看起来像这样:

Parse.Cloud.beforeSave("Entry", function(request, response) {
  var theContest = request.object.get("contest");

  theContest.increment("entries");
  theContest.save().then(function(contest) {
    if (contest.get("entries") > contest.get("maxEntries")) {
      response.error('The contest is full.');
    } else {
      response.success();
    }
  });
}