0

我有一个带有users参考的 Firebase,它有一个字段user_id。( [Firebase]/[app]/users/user_id)

我插入一个用户并分配一个 user_id。但是,当我从 userRef (对 的引用users)读取 user_id 的值时,它并没有第一次读取它。随后的读取工作非常好。

使用调试器,我可以看到在创建用户时,user_id分配了 a。似乎我的第一次调用刷新了 Firebase 参考,因此后续调用现在可以看到更新后的 Firebase(我不认为它是这样的——这就是它的显示方式)。

这是我读取值的代码user_id

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

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

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

有任何想法吗?

4

2 回答 2

2

这里的问题是 .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);
});
于 2012-07-20T19:11:17.337 回答
0

这是等待两个回调的常用方法,使用jQuery 的 Promise 模型once

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);
});
于 2012-07-23T14:35:18.250 回答