如何使函数返回在firebase中的函数(子快照)中设置的数据

时间:2017-02-20 13:59:36

标签: javascript firebase firebase-realtime-database

我想将数据返回到使用firebase代码调用函数的函数,因为firebase查询的异步和嵌套结构无法返回值,我打算使用此逻辑在chart.js中设置工具提示

这是我的代码:

window.onload = function() {
    get_data();
}

function get_data() {
    var data = get_val();
    console.log("...." + data);
}

function get_val() {
    var label = "10/2/2017";
    var Name = localStorage.getItem("VName");
    console.log("Name:::" + Name);
    var at_val;
    var dbref = new Firebase("https://apraisalstaging.firebaseio.com/EmployeeDB/EInfo/");
    dbref.once("value").then(function(snapshot) {
        snapshot.forEach(function(childsnapshot) {
            var data = childsnapshot.val();
            var Nameval = data.Name;
            if (Nameval == Name) {
                console.log("Success");
                Ikey = childsnapshot.key();
                console.log("Key:::" + Ikey);
                var dxRef = new Firebase("https://apraisalstaging.firebaseio.com/EmployeeDB/EApraise/" + Ikey);
                dxRef.once("value").then(function(snapshot) {
                    snapshot.forEach(function(childsnapshot) {
                        var data = childsnapshot.val();
                        console.log(data);
                        if (label == data.Dateval) {
                            console.log("-------> bingo");
                            at_val = data.Attitude;
                            console.log("got value:" + at_val);
                        }
                    });
                }).then(function() {
                    console.log("In then:" + at_val);
                    return at_val;
                });
            }
        })
    })
}

1 个答案:

答案 0 :(得分:0)

以异步方式从Firebase数据库加载数据。您无法返回尚未加载的 now 值。在asyncawait关键字很常见之前,您无法让JavaScript等待异步值。

今天最接近的是从get_val()返回承诺。然后你的调用代码将是:

get_val().then(function(data) {
  console.log("...." + data);
});

为此,您必须将get_val()实施为:

function get_val() {
  var label = "10/2/2017";
  var Name = localStorage.getItem("VName") || "delta";
  console.log("Name:::" + Name);
  var at_val;
  var dbref = firebase.database().ref("EmployeeDB/EInfo/").orderByChild("Name").equalTo(Name);
  return dbref.once("value").then(function(snapshot) {
    var promises = [];
    snapshot.forEach(function(childsnapshot) {
      var data = childsnapshot.val();
      var Nameval = data.Name;
      Ikey = childsnapshot.key;
      var dxRef = firebase.database().ref("EmployeeDB/EApraise/" + Ikey).orderByChild("Dateval").equalTo(label);
      promises.push(
        dxRef.once("value").then(function(snapshot) {
          snapshot.forEach(function(childsnapshot) {
            var data = childsnapshot.val();
            at_val = data.Attitude;
          });
        }).then(function() {
          console.log("In then:" + at_val);
          return at_val;
        })
      );
    })
    return Promise.all(promises);
  })
}

我对get_val()进行了一些更改:

  • 它使用Firebase SDK的新3.x版本。该解决方案也适用于2.x,我只是没有为此设置jsbin。

  • 它会填充一份承诺列表,每个EApraise记录一个

  • 它会返回一个承诺,该承诺会在加载所有EApraise记录时解析。

  • 它使用Firebase查询来查找正确的记录。这消除了检查then()回调中的值的需要。但更重要的是,它确保只下载必要的数据。

要使最后一点成立,您需要为Firebase Database console中的规则添加一些索引定义:

{
  "rules": {
    "EmployeeDB": {
      "EInfo": {
          ".indexOn": "Name"
      }
      "EApraise": {
        "$eid": {
          ".indexOn": "Dateval"
        }
      }
    }
  }
}

这是一个带有工作代码的jsbin:http://jsbin.com/jawamilawo/edit?js,console