Firebase 原子增量可用于更新或设置。但是他们不会在完成时返回更新的值。所以,我必须在更新或设置后立即使用 once('value') : var submitref = firebase.database().ref('/sequence/mykey') return submitref.set(firebase.database.ServerValue.increment(1)).then(_=>{ return submitref.once('value').then(snap=>snap.val()); });让我们假设 2 个线程正在同时执行此代码。submitref.set() 可以正常工作,因为原子增量。但是,如果它们同时完成 submitref.set() 并同时执行 submitref.once('value'),则两个线程将收到相同的递增值 +2。这是一种可能性还是我没有正确理解它?
2 回答

隔江千里
TA贡献1906条经验 获得超10个赞
该increment
操作在服务器上以原子方式执行。在他们的操作中不能保证所有客户端(甚至任何客户端)都会看到所有中间状态。
保持顺序、单调递增计数器的用例更适合事务,因为在事务中,客户端根据当前值控制新值。

慕娘9325324
TA贡献1783条经验 获得超4个赞
JavaScript 是一种单线程语言。相对于任何其他代码,每一位代码都以某种顺序执行。除了通过任何本机库外,没有线程争用,这里不是这种情况。此外,实时数据库将所有操作按照接收顺序通过单个连接进行流水线处理,因此其操作也具有一致的顺序。
综上所述,我想您可能会遇到这样一种情况,即两次调用发生set()
在两次调用之前once()
,这意味着它们都将显示两倍的增量值。
在这种情况下,您最好使用 listener withon()
以便随时了解最新的值,并在看到它发生变化时对其采取行动,而不管建立它之后会发生什么。
添加回答
举报
0/150
提交
取消