使用`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
参数,这个本地事件被抑制,并且once
callback只会在从服务器获取数据之后被调用:
dataRef.transaction(function (currentValue) { if (currentValue) { // make changes } return currentValue; }, function(){}, false);