我的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
上的阅读(以完全相同的方式和同时)每次都有效。
有什么想法吗?
答案 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 model和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);
});