Javascript 解析服务器原子增量结果

Javascript 解析服务器原子增量结果,javascript,parse-platform,parse-server,Javascript,Parse Platform,Parse Server,在我的解析后端中,我有一个数组,其中包含唯一的数字代码,因此用户不能两次获得相同的代码。由于这个原因,我在某个表的某个列的某个地方保留了这个数组的索引 现在有一个非常简单的操作-用户要求一个唯一的代码。cloud函数递增索引的当前值,并返回新索引处的数组值。问题是,乍一看,Parse JS API只执行了原子级的增量操作,而没有执行下面的读取操作,因为increment不会返回带有在该增量期间设置的值的承诺 现在想象以下场景(伪代码): 字段索引具有值76,两个用户试图同时获取下一个代码: Us

在我的解析后端中,我有一个数组,其中包含唯一的数字代码,因此用户不能两次获得相同的代码。由于这个原因,我在某个表的某个列的某个地方保留了这个数组的索引

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

现在想象以下场景(伪代码):

字段
索引
具有值
76
,两个用户试图同时获取下一个代码:

User1->
increment('index')->save->then(obj1)->返回数组[obj1.index]

User2->
increment('index')->save->then(obj2)->返回数组[obj2.index]

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


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

Increment会返回原子递增的最终值:

  • 首先进行单元测试,以说明如何使用它:

    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);
      });
    
  • 幕后发生的事情如下(如果您使用mongo,postgress也有类似的情况):

    • 转换为返回的mongo$inc操作
    • 解释$inc的文档,其中包括“$inc是单个文档中的原子操作。”

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

  • 首先进行单元测试,以说明如何使用它:

    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);
      });
    
  • 幕后发生的事情如下(如果您使用mongo,postgress也有类似的情况):

    • 转换为返回的mongo$inc操作
    • 解释$inc的文档,其中包括“$inc是单个文档中的原子操作。”

  • 试着回顾一下这个:谢谢,但我需要一些更具可读性和记忆性的东西,在我的例子中,这些是4位数试着回顾一下这个:谢谢,但我需要一些更具可读性和记忆性的东西,在我的例子中,这些是4位数要100%清楚:
    increment()
    是否更新并返回最终值,还是
    保存()
    ?i、 e.如果在
    增量
    调用和
    保存
    调用之间存在延迟,是否有可能外部更改影响结果?或者
    增量
    是否标记对象进行增量,然后在
    保存
    调用期间执行增量?如果两个或多个在保存调用之前,同一记录中的字段都标记为递增?1
    increment()
    不执行更新,它只是在执行
    save
    时将字段标记为increment。2.您可以为
    increment
    标记所需的任意多个字段,它将按照您的预期工作。但不要相信我的话,试试看。要100%清楚:是
    增量()
    更新并返回最终值,还是
    保存()
    ?i、 e.如果在
    增量
    调用和
    保存
    调用之间存在延迟,是否有可能外部更改影响结果?或者
    增量
    是否标记对象进行增量,然后在
    保存
    调用期间执行增量?如果两个或多个在保存调用之前,同一记录中的字段都标记为递增?1
    increment()
    不执行更新,它只是在执行
    save
    时将字段标记为increment。2.您可以为
    increment
    标记所需的任意多个字段,它将按照您的预期工作。但不要相信我的话,试试看。