Javascript Firebase字段延迟更新
我有一个带有Javascript Firebase字段延迟更新,javascript,firebase,Javascript,Firebase,我有一个带有用户参考的Firebase,它有一个字段用户id。 ([Firebase]/[app]/users/user\u id) 我插入一个用户并分配一个用户id。但是,当我从userRef(对用户的引用)读取用户id的值时,它不会第一次读取它。后续阅读效果非常好 使用调试器,我可以看到在创建用户时,会分配一个user\u id。我的第一次调用似乎刷新了Firebase引用,因此后续调用现在看到的是udpated Firebase(我不认为它是这样的-它只是这样出现的) 这是我用来读取use
用户
参考的Firebase,它有一个字段用户id
。
([Firebase]/[app]/users/user\u id
)
我插入一个用户并分配一个用户id。但是,当我从userRef(对用户的引用)读取用户id的值时,它不会第一次读取它。后续阅读效果非常好
使用调试器,我可以看到在创建用户时,会分配一个user\u id
。我的第一次调用似乎刷新了Firebase引用,因此后续调用现在看到的是udpated Firebase(我不认为它是这样的-它只是这样出现的)
这是我用来读取user\u id
值的代码:
var userID = 0;
userRef.on('value', function(snapshot) {
userID = snapshot.val().user_id;
});
alert(userID);
第一次,警报显示0
。每次之后,它都会显示正确的值
为了让问题变得更加奇怪,我还有一个games
引用,带有games\u id
,创建方式与user
相同。但我对游戏id的解读(以完全相同的方式&同时)每次都有效
有什么想法吗?这里的问题是.on()通常不会立即触发回调函数。特别是,第一次在某个位置执行.on()时,Firebase必须向服务器询问当前值,等待响应,然后调用回调。这一切都是异步进行的
当前编写代码的方式是,“alert(userID);”在回调代码(“userID=snapshot.val().user_id;”)之前运行,因此它第一次总是报告0。简单的修复方法是将alert()移动到回调中:
var userID = 0;
userRef.on('value', function(snapshot) {
userID = snapshot.val().user_id;
alert(userID);
});
下面是一种使用和等待两次回调的常用方法:
谢谢因此,如果我的alert()需要来自2个引用的值,那么最好将第二个on()放在第一个的回调中,将alert()放在第二个的回调中吗?这是最简单的方法,但会稍微慢一点,因为在第一个请求完成之前,您不会启动第二个请求。理想情况下,你可以同时启动它们。要做到这一点,您需要做一些额外的工作来跟踪它们是否已完成,然后在回调中执行类似于“如果(/*两个都已完成,但我尚未完成处理*/){/*执行我的处理*/}”
var userID = 0;
// sends a callback to fx where the results can be stored
function defer( fx ) {
return function() {
var deferred = $.Deferred();
fx( function(snapshot) { deferred.resolve(snapshot.val(); } );
return deferred.promise();
}
}
$.when( // wait for both actions to complete
defer( function(callback) { userRef.once('value', callback) }),
defer( function(callback) { widgetRef.once('value', callback) })
).then( function(values) {
// both deferreds are done now
// and values contains an array with the snapshot.val() from each call
console.log(values);
});