我想使用once
方法从Firebase ref中检索数据,但是我没有在快照中接收任何数据。
这是简单的数据检索:
编辑经过进一步检查后,我发现在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
方法没有用处。
答案 0 :(得分:2)
在transaction
applyLocally
中有第三个参数once
。
默认情况下,每次运行事务更新功能时都会引发事件。因此,如果它多次运行,您可能会看到中间状态。您可以将此值设置为false以禁止这些中间状态,而是等到事务完成后再引发事件。
由于此默认值,null
值侦听器在事务首次在本地运行后触发,即使没有从服务器检索到数据(将currentValue
作为事务传递&#39} ; s false
)。通过将applyLocally
作为once
参数传递,此本地事件将被禁止,并且只有在从服务器检索到数据后才会调用dataRef.transaction(function (currentValue) {
if (currentValue) {
// make changes
}
return currentValue;
},
function(){},
false);
回调:
{{1}}