Firebase交易的奇怪行为

use*_*521 2 firebase

我的firebase看起来像这样:

在此处输入图片说明

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

Firebase = require 'firebase'

ref = new Firebase 'https://my_firebase.firebaseio.com/items'

ref.once 'child_added', (snapshot) ->
  childRef = snapshot.ref()
  console.log "child_added", childRef.toString(), snapshot.val()
  childRef.transaction(
    (data) ->
      console.log 'transaction on data', data
      return if !data or data.my_key isnt 'my_val'
      data.my_key = 'new_val'
      return data
    ,
    (err, commited, snapshot) ->
      if err
        console.error 'error', err
        return
      console.log 'commited? '+commited
      console.log 'server data', snapshot.val()
    ,
    false
  )
Run Code Online (Sandbox Code Playgroud)

并输出:

child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' }
transaction on data null
commited? false
server data null
Run Code Online (Sandbox Code Playgroud)

当第三个参数transaction(...)为true 时,也会发生同样的情况。为了使此代码正常工作,我必须更改ref.once 'child_added', (snapshot) ->ref.on 'child_added', (snapshot) ->onceon)。更改后的输出为:

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' }
Run Code Online (Sandbox Code Playgroud)

似乎由于某种原因,当我使用once数据时,未正确同步并且本地快照未更新,并且事务“认为”引用下没有数据。是错误还是我做错了什么?我知道updateFunction可以多次调用的事务,以及第三个参数(我尝试过使用true和false选项),但我仍然不明白为什么在使用once获取子对象时事务不起作用。

Rob*_*rco 5

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

这是正常现象,这是预期的。但是,如果交易没有成功,我建议通过support@firebase.com与支持人员联系,以继续解决问题。

  • 基本上,如果您在事务功能中输入null,则将其返回。这将使Firebase SDK最终使用更新后的值重试。我遇到了这个问题,我的错误是返回`undefined`,即使在从服务器中获取数据之前,它也会取消事务。 (3认同)