如何将Firebase的子级值检索到全局范围?

时间:2015-02-25 18:38:32

标签: javascript firebase

我的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命令的事件。

0 个答案:

没有答案