【问题标题】:JavaScript - Firebase value to global variableJavaScript - 全局变量的 Firebase 值
【发布时间】:2019-01-31 08:28:28
【问题描述】:
ref.child("path").on("value", snapshot => {
  var z = Object.keys(snapshot.val())[2];
  y = snapshot.val()[z];

  //Call the friggin thing
  exportData(y);

  function exportData(y) {
    exporting(y);
  }
});

function exporting(y) {
  var x = y;
  //console.log(y);
  return x;
}

我想将 x 存储在一个全局变量中。

我不能在下面做代码,因为 'y' 不会被传递。 'y' 是一个局部变量。

var answer = exporting();
answer();

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    将值存储在全局变量中不是问题,只是 when 让您感到困惑。

    数据是从 Firebase 异步加载的。这意味着代码不会按照您可能预期的顺序运行。您可以通过在其中输入一些日志来最轻松地看到这一点:

    console.log("Before starting to load value");
    ref.child("path").on("value", snapshot => {
      console.log("Loaded value");
    });
    console.log("After starting to load value");
    

    当您运行此代码时,它会打印:

    开始加载值之前

    开始加载值后

    加载值

    这可能不是您期望的顺序。但它完美地解释了为什么在访问全局变量时未设置它:该值尚未从数据库中返回。

    这就是为什么您需要将需要数据库中数据的代码移动到内部回调函数中。或者,您可以使用 once() 返回一个承诺这一事实,从而更容易处理:

    function loadData() {
     return ref.child("path").once("value");
    });
    
    loadData().then((snapshot) => {
      ... use the data from snapshot
    });
    

    请注意,异步加载对于刚接触异步加载的开发人员来说是一个令人难以置信的常见问题。我强烈建议您查看有关该主题的其他一些问题:

    【讨论】:

      【解决方案2】:

      我想出了一个使用 jQuery 的解决方案

      ref.child("path").on("value", snapshot => {
        var y = Object.keys(snapshot.val())[2];
        z = snapshot.val()[y];
        $("#id").attr("data-stored", z);
        updateVal();
      });
      
      var x;
      function updateVal() {
        x = parseFloat($("#id").attr("data-stored"));
      }
      
      console.log("It Works! " + x);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多