解析服务器原子增量结果

时间:2017-03-19 20:41:30

标签: javascript parse-platform parse-server

在我的Parse后端,我有一个包含唯一编号代码的数组,因此用户必须无法获得相同的代码两次。出于这个原因,在某个表的某一列的某处,我保留了这个数组的索引。

现在有一个非常简单的操作 - 用户要求一个唯一的代码。云函数递增索引的当前值,并在新索引处返回数组的值。问题是乍一看Parse JS API只有原子执行的递增操作,而不是后续的读操作,因为increment不会返回一个带有在 THAT 增量期间设置的值的promise。

现在假设以下场景(伪代码):

字段index的值为76,两个用户同时尝试获取下一个代码:

User1 - > increment('index') -> save -> then(obj1) -> return array[obj1.index]

User2 - > increment('index') -> save -> then(obj2) -> return array[obj2.index]

现在,原子增量将保证在这两次调用之后索引列的值为78。但是obj1obj2呢?如果它们的值读取不是与增量操作一起原子地完成,而是在执行增量后通过提取完成,那么它们都可能具有值78!整个唯一性逻辑将被打破。

有没有办法在Parse中获取原子写操作结果?

1 个答案:

答案 0 :(得分:2)

增量确实返回原子递增的最终值:

  1. 首先进行单元测试以显示它的使用方式:

    fit('increment', (done) => {
        new Parse.Object('Counter')
          .set('value', 1)
          .save()
          .then(result => {
            console.log('just saved', JSON.stringify(result));
            return result
              .increment('value')
              .save();
          })
          .then(result => {
            console.log('incremented', JSON.stringify(result))
            expect(result.get('value')).toBe(2);
            done();
          })
          .catch(done.fail);
      });
    
  2. 在幕后,这里发生了什么(如果你正在使用mongo,那里也有类似的事情):

    • MongoAdapter 变成一个mongo $ inc操作,返回
    • Mongo文档解释$ inc,其中包含" $ inc是单个文档中的原子操作。"