2014-03-05 44 views
0

我试图访问简单的Firebase数据库(https://blazing-fire-6348.firebaseio.com)并分别存储其值,但它们未正确存储。下面的代码会分析出所有10个,而不是存储在Firebase中的值。我不认为我的问题只是范围,而是Firebase语法。代字号是网址,stackoverflow只是不会让我多次发布链接。尝试从Javascript中读取Firebase变量

感谢您提供的任何帮助。

var dataRef = new Firebase("~~~/a"); 
dataRef.on('value', function(snapshot) { 
    // this code will only execute once the server *returns* a value for a 
}); 
// this code will execute straight after the call to the server has *started* 

您的代码将引发三个电话到火力地堡服务器,每一个都可以采取:

var a = 10; var b = 10; var c = 10; 

var dataRef = new Firebase("~~~/a"); 
dataRef.on('value', function(snapshot) { 
    a = snapshot.val(); 
    // alert(a); 
}); 
var dataRef = new Firebase("~~~/b"); 
dataRef.on('value', function(snapshot) { if(snapshot.val() != null){ 
    b = snapshot.val(); 
    // alert(b); 
} }); 
var dataRef = new Firebase("~~~/c"); 
dataRef.on('value', function(snapshot) { if(snapshot.val() != null){ 
    c = snapshot.val(); 
    // alert(c); 
} }); 

alert(a); alert(b); alert(c);` 

`

+0

如果启用注释掉的警报,那些警报将显示正确的值。你试过了吗? –

+0

是的,他们会的。我正在寻找一种方法来访问dataRef.on函数之外的变量。 – James

+0

当底部的'alert's显示时,您可以**随时随地访问**变量。但是,在dataRef.on('value''回调触发之后,它们将不具备远程Firebase的价值,它来自AJAX调用的异步特性,鉴于您所看到的行为是完全预期的,也许您可以用另一种方式描述你正在努力完成的任务 –

回答

1

您的问题,从一个事实,即on呼叫火力地堡是异步的茎一些不同的时间来完成。

因此,您不能简单地在脚本末尾输入alert这三个结果,并期望它们具有来自服务器的值。在脚本中,您所知道的是,所有到服务器的呼叫都有开始。尽管如此,我们无法保证其中任何一个或全部都有完成

相反,您必须使用策略来确定所有呼叫何时完成。

一种简单的方法在你的例子来做到这一点:

var a, b, c; 

var dataRef = new Firebase("~~~/a"); 
dataRef.on('value', function(snapshot) { 
    a = snapshot.val(); 
    if (a && b && c) alert(a+b+c); 
}); 
var dataRef = new Firebase("~~~/b"); 
dataRef.on('value', function(snapshot) { if(snapshot.val() != null){ 
    b = snapshot.val(); 
    if (a && b && c) alert(a+b+c); 
} }); 
var dataRef = new Firebase("~~~/c"); 
dataRef.on('value', function(snapshot) { if(snapshot.val() != null){ 
    c = snapshot.val(); 
    if (a && b && c) alert(a+b+c); 
} }); 

每个回调检查其他人是否也完成(接收快照,您传递到on功能)。只有当所有的数值都被设定好后,它才会提醒他们的总和。

+1

请注意,这个(非常优秀的)例子只会在没有任何值为空的情况下触发警报 – Kato

+0

非常感谢,这正是我一直在寻找的。 – James