Javascript 允许重复的并发beforeSave调用
为了防止创建某些对象,我在该类型对象的beforeSave cloud函数中设置了一个条件 但是,当同时创建两个对象时,条件不会相应地起作用 这是我的密码: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 (
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();
}
});
}