【问题标题】:Retrieving Firebase value using `once` callback with transaction使用带有事务的“once”回调检索 Firebase 值
【发布时间】:2014-10-03 05:07:14
【问题描述】:

我想使用 once 方法从 Firebase 引用中检索数据,但在快照中没有收到任何数据。 这是简单的数据检索:

编辑 经过进一步检查,我发现在once 值侦听器之后不久安排了一个事务。 (为简单起见,我将在此代码示例的侦听器之后直接放置事务。)

dataRef.once('value', function (snapshot) {
  snapshot.val(); // returns `null`
});

dataRef.transaction(function (currentValue) {
  if (currentValue) {
    // make changes
  }
  return currentValue;
});

这个 firebase ref 有数据。为了验证,我尝试使用on 而不是once。在这种情况下,回调被调用了两次:

dataRef.on('value', function (snapshot) {
  snapshot.val(); // returns `null` first, then called again and returns correct value
});

是什么导致了这种行为?我希望快照在第一次调用回调时具有正确的值。否则,once 方法没有用处。

【问题讨论】:

  • 我用过once 很多次,知道它可以工作。很可能您正在做一些不同的事情,不幸的是,仅从这些代码 sn-ps 很难分辨出来。您能否在问题中(单击“编辑”,然后单击“代码 sn-p”)或在 jsfiddle/jsbin 上提供问题的最小再现?
  • 我也至少用过一次……呃,一次,成功了;数以万计的不起眼的开发人员和数十个非常杰出的企业客户都做了同样的事情。
  • 感谢您的健全性检查,您说得对,还有其他事情正在发生。经过更多的挖掘和检查,我发现在once 值侦听器之后不久安排了一笔交易。我将更新原始问题以反映新信息。

标签: javascript node.js firebase


【解决方案1】:

transactionFirebase docs 中有第三个参数applyLocally

默认情况下,每次事务更新函数运行时都会引发事件。因此,如果它运行多次,您可能会看到中间状态。您可以将其设置为 false 以抑制这些中间状态,而是等到事务完成后再引发事件。

由于此默认值,once 值侦听器在事务第一次在本地运行后触发,即使尚未从服务器检索到数据(将null 作为事务的currentValue 传递)。通过将false 作为applyLocally 参数传递,该本地事件被抑制,并且只有在从服务器检索到数据后才会调用once 回调:

dataRef.transaction(function (currentValue) {
  if (currentValue) {
    // make changes
  }
  return currentValue;
},
function(){},
false);

【讨论】:

  • 有趣的角落案例。让我再次庆幸我不经常使用once。在大多数情况下,我建议使用on。当您使用 Firebase 时,您必须从“这是我加载数据的地方”切换到“我的数据不断同步,因此可以随时出现”的心态。您正在观看“活”数据结构,而不是从静态数据结构加载
  • 是的,这很有趣,我很高兴能对我所经历的行为做出解释。感谢您的提示。
猜你喜欢
  • 2017-10-17
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多