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);
});