【问题标题】:Attempting to read variables from Firebase with Javascript尝试使用 Javascript 从 Firebase 读取变量
【发布时间】:2014-03-05 01:13:15
【问题描述】:

我正在尝试访问一个简单的 Firebase 数据库 (https://blazing-fire-6348.firebaseio.com) 并单独存储其值,但它们没有正确存储。下面的代码吐出所有 10,而不是存储在 Firebase 中的值。我不认为我的问题只是范围,而是 Firebase 语法。波浪号是网站网址,stackoverflow 只是不允许我多次发布链接。

感谢您提供的任何帮助。

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);`

`

【问题讨论】:

  • 如果您启用注释掉的警报,这些警报将显示正确的值。你试过了吗?
  • 是的,他们会的。我正在寻找一种方法来访问 dataRef.on 函数之外的变量。
  • 正如底部的alerts 所示,您可以在任何地方访问变量。但在dataRef.on('value' 回调触发之前,它们不会从远程 Firebase 获得价值。它来自 AJAX 调用的异步特性。鉴于您所看到的行为完全是意料之中的,也许您可​​以用另一种方式描述您想要完成的事情。

标签: javascript firebase


【解决方案1】:

您的问题源于 Firebase 中的 on 调用是异步的:

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*

您的代码将触发对 Firebase 服务器的三个调用,每个调用都可能需要不同的时间才能完成。

因此,您不能简单地 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)检查其他回调是否也已完成。只有当所有的值都设置好后,才会提醒它们的总和。

【讨论】:

  • 请注意,这个(非常出色的)示例只会在没有任何值为空时触发警报。
  • 非常感谢,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2014-02-14
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2013-09-28
相关资源
最近更新 更多