我的Firebase数据库设置如下:
>>XXX
>>>>dislike: 0
>>>>like: 1
在我的网络应用程序中,我可以通过以下方式将其值检索到控制台:
var fb = new Firebase('https://xxx.firebaseio.com');
fb.child('like').once('value',function(snapshot){
console.log(snapshot.val());
});
fb.child('dislike').once('value',function(snapshot){
console.log(snapshot.val());
});
现在,如果我想将这些值检索到全局范围中,那么在执行此操作时它将返回undefined:
var fb = new Firebase('https://xxx.firebaseio.com');
var like = fb.child('like').once('value',function(snapshot){
return snapshot.val();
});
var dislike = fb.child('dislike').once('value',function(snapshot){
return snapshot.val();
});
当然,通过将整个脚本放在这两个范围内,我对这个问题有一个愚蠢的解决方案 - 但如果我有数百个范围可以使用,如果我想动态打开和关闭它们,那将是一个灾难。这是我的解决方案:
var likeRef = new Firebase('https://xxx.firebaseio.com/like');
var dislikeRef = new Firebase('https://xxx.firebaseio.com/dislike');
likeRef.once('value',function(likeObj){
dislikeRef.once('value',function(dislikeObj){
var like = likeObj.val();
var dislike = dislikeObj.val();
});
});
以下是来自来源< Frank van Puffelen>的Passing variable in parent scope to callback function建议的另一个答案,并且它没有起作用,因为它似乎只适用于添加新对象的脚本数组。这是我的尝试:
var like = 0;
var dislike = 0;
var val = 0;
var fb = new Firebase('https://xxx.firebaseio.com/');
function fb_like() {
fb.child('like').on('value', read_val);
return val;
}
function fb_dislike() {
fb.child('dislike').on('value', read_val);
return val;
}
function read_val(snapshot) {
var val = snapshot.val();
}
fb_like();
fb_dislike();
console.log(like);
console.log(dislike);
正如您所料,控制台记录0和0,而不是frabase xxx数据库中的喜欢和不喜欢的值。
事实上,我更进一步使用数组而不是整数值,它仍然无法工作:
var like = [0];
var dislike = [0];
var val = [0];
var fb = new Firebase('https://xxx.firebaseio.com/');
function fb_like() {
fb.child('like').on('value', read_val);
console.log('fb_like: ' + val[0]);
return val;
}
function fb_dislike() {
fb.child('dislike').on('value', read_val);
console.log('fb_dislike: ' + val[0]);
return val;
}
function read_val(snapshot) {
val[0].value = snapshot.val();
}
fb_like();
fb_dislike();
console.log('Like: ' + like[0]);
console.log('Dislike: ' + dislike[0]);
控制台将记录:
fb_like: 0
fb_dislike: 0
Like: 0
Dislike: 0
这意味着可能意味着只将新对象添加(推送)到数组中才能在全局范围内工作,更改对象的值只会影响本地范围。
然后,我意识到即使将新对象添加(推送)到数组中也不会影响全局范围。这是我的尝试:
var like = 0;
var likeObj = [];
var fb = new Firebase('https://xxx.firebaseio.com/');
function fb_like() {
fb.child('like').on('value', read_like);
console.log('fb_like: ' + likeObj[0]);
return likeObj;
}
function read_like(snapshot) {
likeObj.push(snapshot.val());
console.log('likeObj: ' + likeObj[0]);
}
fb_like();
like = likeObj[0];
console.log('Like: ' + like);
结果,控制台记录:
fb_like: undefined
Like: undefined
likeObj: 1
这可能意味着read_like()不会影响大于它自身的范围,使用array.push命令的事件。