并发之前保存允许重复的调用
Concurrent beforeSave calls allowing duplicates
为了防止创建某些对象,我在该类型的对象之前保存云函数中设置了一个条件。
但是,当同时创建两个对象时,条件不会相应地起作用。
这是我的代码:
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 个名额,并且同时保存了两个条目,则它们都会被添加。
我知道这是一个边缘情况,但也是一个合理的担忧。
Parse使用的是Mongodb,这是一个NoSQL数据库,旨在非常可扩展,因此提供有限的同步功能。您在这里真正需要的是相互排斥,不幸的是,Boolean
字段不支持这种互斥。但是,Parse 为计数器和数组字段提供了原子性,您可以使用这些字段来强制实施某些控制。
见 http://blog.parse.com/announcements/new-atomic-operations-for-arrays/和 https://parse.com/docs/js/guide#objects-updating-objects
通过使用增量
然后在保存回调中执行检查(而不是获取对象并检查其上的布尔值)解决了这个问题。
看起来像这样:
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();
}
});
}
相关文章:
- 我有可能防止黑客使用网络控制台用JavaScript重复调用upvote(AJAX)函数吗
- setTimeout()在忽略间隔的情况下重复调用函数
- 重复调用的同一函数会重置setTimeout内部函数
- ng重复调用控制器功能的次数太多
- nodejs或expressjs在没有返回响应的情况下重复调用路由
- 有史以来最奇怪的函数重复调用
- ng中的Angularjs函数重复调用过多次
- ZombieJS:从 for 循环重复调用时间歇性崩溃
- 如何在javascript中发出简短的哔哔声,可以在页面上*重复*调用
- Rails 3 :remote => true & .创建要创建的重复调用
- AngularJS:我可以在一定的时间间隔内重复调用一个函数
- ng从控制器函数重复调用
- 防止在单击事件中重复调用异步加载函数
- 除非函数的工作完成,否则避免重复调用函数
- backbone.js collection-重复调用fetch以获取所有“;页面”;来自服务器
- angular:ng中继器中的ng类,重复调用
- 如何重复调用一个函数并等待下一次调用之前完成
- 在异步.直到(test, function, callback)测试函数没有被重复调用
- ComponentWillMount一直被重复调用
- 异步.瀑布重复调用