Firebase字段延迟更新

时间:2012-07-20 18:41:20

标签: javascript firebase

我的Firebase带有users引用,其中包含字段user_id。 ([Firebase]/[app]/users/user_id

我插入了一个用户&分配user_id。但是,当我从userRef(对users的引用)读取user_id的值时,它第一次不会读取 。随后的读取工作完全正常。

使用调试器,我可以看到创建用户时,分配了user_id。看起来我的第一个调用刷新了Firebase引用,以便后续调用现在可以看到未使用的Firebase(我不认为它就是这样 - 这就是它出现的方式)。

这是我读取user_id的价值的代码:

var userID = 0;
userRef.on('value', function(snapshot) {
    userID = snapshot.val().user_id;
});
alert(userID);

第一次,警报显示0。每次之后,它都会显示正确的值。

为了使问题更加奇怪,我还有一个games引用game_id,其创建方式与user相同。但我在game_id上的阅读(以完全相同的方式和同时)每次都有效。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这里的问题是.on()不会(通常)立即触发你的回调函数。特别是,当您第一次在某个位置执行.on()时,Firebase必须向服务器询问当前值,等待响应,然后 THEN 调用您的回调。而且这一切都是异步的。

您的代码当前的编写方式,“alert(userID);”正在回调代码(“userID = snapshot.val()。user_id;”)之前运行,因此它始终首次报告0。简单的解决方法是在回调中移动alert():

var userID = 0;
userRef.on('value', function(snapshot) {
    userID = snapshot.val().user_id;
    alert(userID);
});

答案 1 :(得分:0)

以下是使用jQuery's Promise modelonce等待两次回调的常用方法:

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