使用`once`callback事务来检索Firebase值

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

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

 dataRef.once('value', function (snapshot) { snapshot.val(); // returns `null` }); dataRef.transaction(function (currentValue) { if (currentValue) { // make changes } return currentValue; }); 

在这个Firebase参考资料中有数据。 为了validation,我尝试使用而不是once 。 在这种情况下,callback被调用两次:

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

什么是造成这种行为? 我希望快照在首次调用callback时具有正确的值。 否则, once方法没有用处。

在Firebase的transaction 文档中有第三个参数applyLocally

默认情况下,每次事务更新函数运行时都会引发事件。 所以如果它运行多次,你可能会看到中间状态。 您可以将其设置为false以禁止这些中间状态,而是在引发事件之前等待事务完成。

由于这个默认值,即使没有从服务器检索到数据(传递null作为事务的当前值),第once在本地运行事务后, once值侦听器也会触发。 通过传递false作为applyLocally参数,这个本地事件被抑制,并且oncecallback只会在从服务器获取数据之后被调用:

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