Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 允许重复的并发beforeSave调用_Javascript_Parse Platform_Parse Cloud Code - Fatal编程技术网

Javascript 允许重复的并发beforeSave调用

Javascript 允许重复的并发beforeSave调用,javascript,parse-platform,parse-cloud-code,Javascript,Parse Platform,Parse Cloud Code,为了防止创建某些对象,我在该类型对象的beforeSave cloud函数中设置了一个条件 但是,当同时创建两个对象时,条件不会相应地起作用 这是我的密码: Parse.Cloud.beforeSave("Entry", function(request, response) { var theContest = request.object.get("contest"); theContest.fetch().then(function(contest){ if (

为了防止创建某些对象,我在该类型对象的beforeSave cloud函数中设置了一个条件

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

这是我的密码:

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();
    });
});
基本上,如果竞赛已满,我不希望创建参赛对象。但是,如果比赛中还有1个名额,同时保存了两个参赛项目,则它们都会被添加


我知道这是一个边缘案例,但这是一个合理的担忧。

Parse正在使用Mongodb,这是一个NoSQL数据库,设计为非常可扩展,因此提供有限的同步功能。这里真正需要的是互斥,不幸的是,
Boolean
字段不支持互斥。然而,Parse为计数器和数组字段提供了原子性,您可以使用它们来实施一些控制


通过使用increment,然后在save回调中进行检查(而不是获取对象并在其上检查布尔值),解决了这个问题

看起来像这样:

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