【问题标题】:Strange behaviour of firebase transactionfirebase 交易的奇怪行为
【发布时间】:2014-11-27 11:23:30
【问题描述】:

我的火力基地是这样的:

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

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
  )

然后输出:

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

transaction(...) 的第三个参数为 true 时也会发生同样的情况。 为了使这段代码正常工作,我必须将ref.once 'child_added', (snapshot) -> 更改为ref.on 'child_added', (snapshot) ->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' }

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

【问题讨论】:

    标签: firebase


    【解决方案1】:

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

    这是正常,并且是意料之中的。但是,如果交易没有成功,我建议您通过 support@firebase.com 与支持人员联系,以继续解决问题。

    【讨论】:

    • 我认为这是不正常的,因为once, 'child_added' 返回了正确的数据,所以我认为它与本地副本同步?那么为什么事务在 null 上运行?无论如何,这很愚蠢——想象我在我的应用程序中唯一想做的事情就是运行一个事务——这意味着我的应用程序总是会失败,因为数据不会被同步并且事务将看到null。我相信如果数据没有同步交易应该在服务器上检查它......
    • 如果您使用once,客户端将不会缓存任何数据,因为您已经表明您只想一次检索它,但是不保持它更新。如果您改用on,客户端将始终缓存数据并保持该缓存更新。
    • 但我只想检查一次数据然后运行事务。我尝试在第一个失败后重新运行事务,但再次传递给更新函数的数据是null
    • 基本上,如果您在交易函数中获得null 作为输入,则返回它。这将使 firebase sdk 最终使用更新的值重试。我遇到了这个问题,我的错误是返回undefined,它甚至在从服务器获取数据之前就取消了事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2017-06-21
    • 1970-01-01
    • 2014-07-11
    • 2018-05-23
    • 2021-06-10
    • 2017-07-21
    相关资源
    最近更新 更多