2016-01-24 39 views
0

为了防止创建某些对象,我在该类型的对象的beforeSave云功能中设置了条件。并发beforeSave调用允许重复

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

这里是我的代码:

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个位置并且同时保存两个条目,则它们都会被添加。

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

回答

0

解析是使用Mongodb,这是一个NoSQL数据库,其设计非常具有伸缩性,因此提供了有限的同步功能。您真正需要的是互斥,但不幸在Boolean字段中不受支持。然而,Parse为计数器和数组字段提供了原子性,您可以使用它们来强制执行某些控制。

利用增量,然后做在保存回调的检查(而不是获取的对象,并对其检查布尔)查看http://blog.parse.com/announcements/new-atomic-operations-for-arrays/https://parse.com/docs/js/guide#objects-updating-objects

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