我想将数据返回到使用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;
});
}
})
})
}
答案 0 :(得分:0)
以异步方式从Firebase数据库加载数据。您无法返回尚未加载的 now 值。在async
和await
关键字很常见之前,您无法让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