firebase事务的奇怪行为

firebase事务的奇怪行为,firebase,Firebase,我的firebase看起来像这样: 这是测试代码(咖啡脚本): 和输出: child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' } transaction on data null commited? false server data null 当事务(…)的第三个参数为true时,也会发生同样的情况。 要使此代码正常工作,我必须将ref.once'child\u added'(快照)->

我的firebase看起来像这样:

这是测试代码(咖啡脚本):

和输出:

child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' }
transaction on data null
commited? false
server data null
事务(…)
的第三个参数为true时,也会发生同样的情况。 要使此代码正常工作,我必须将
ref.once'child\u added'(快照)->
更改为
ref.on'child\u added'(快照)->
once
更改为
on
)。此更改后,输出为:

child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' }
transaction on data { my_key: 'my_val' }
commited? true
server data { my_key: 'new_val' }

似乎出于某种原因,当我使用
一次时
数据没有正确同步,本地快照没有更新,事务“认为”ref下没有数据。这是一个bug还是我做错了什么?我知道可以多次调用
updateFunction
的事务,以及第三个参数(我尝试了true和false选项),但我仍然无法理解为什么使用
一次
获取子项时事务不起作用。

事务最终应该成功,并在数据的正确状态下运行,但最初将在“未缓存”状态下运行,这意味着它将针对客户端的本地数据副本运行(可能是
null
),尝试将更改提交给服务器(这将失败),然后重新尝试事务


这是正常的,也是意料之中的。但是,如果交易没有成功,我建议您联系support@firebase.com继续排除故障。

我认为这不正常,因为
一次,“child\u added”
返回了正确的数据,所以我认为它与本地副本同步了?那么为什么事务在null上运行呢?无论如何,这是愚蠢的-想象一下,我想在我的应用程序中做的唯一一件事就是运行一个事务-这意味着我的应用程序将始终失败,因为数据不会同步,事务将显示
null
。我认为,如果数据未同步,事务应该在服务器上检查它……如果您使用了一次
,客户端将不会缓存任何数据,因为您已经表示,您只想检索一次,而不想保持更新。如果改为在
上使用
,客户端将始终缓存数据并保持缓存更新。但我只想检查数据一次,然后运行事务。我试图在第一个事务失败后重新运行事务,但传递给更新函数的数据仍然是
null
。基本上,如果事务函数中输入了
null
,则返回它。这将使firebase sdk最终使用更新的值重试。我遇到了这个问题,我的错误是返回
undefined
,它甚至在从服务器获取数据之前就取消了事务。
child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' }
transaction on data { my_key: 'my_val' }
commited? true
server data { my_key: 'new_val' }