Javascript 从一个函数到另一个函数的全局变量
在这个文件中,我试图发送从Firebase云中获取的值,并将它们显示在 另一个函数上的图表。问题是,我无法在另一个函数上获取这些值,已经尝试将变量设置为全局变量,但无法工作。我读过多篇关于在javascript中将变量从一个函数发送到另一个函数的文章,但我所做的一切都没有起作用,第二个函数中的控制台日志总是runChart:=>undefined undefined(以及图表没有正确显示,缺少条)。我做错了什么?例如,尝试过像这样的简单解决方案,但什么都没有Javascript 从一个函数到另一个函数的全局变量,javascript,Javascript,在这个文件中,我试图发送从Firebase云中获取的值,并将它们显示在 另一个函数上的图表。问题是,我无法在另一个函数上获取这些值,已经尝试将变量设置为全局变量,但无法工作。我读过多篇关于在javascript中将变量从一个函数发送到另一个函数的文章,但我所做的一切都没有起作用,第二个函数中的控制台日志总是runChart:=>undefined undefined(以及图表没有正确显示,缺少条)。我做错了什么?例如,尝试过像这样的简单解决方案,但什么都没有 var a, b, c; funct
var a, b, c;
function getFirebase() {
db.collection('metas').doc('meta1097').get().then(function (doc) {
console.log('Document: ', ' => ', doc.get('jan'));
a= doc.get('jan');
});
db.collection('metas').doc('meta1200').get().then(function (doc) {
console.log('Document: ', ' => ', doc.get('jan'));
b= doc.get('jan');
});
db.collection('metas').doc('meta1440').get().then(function (doc) {
c= doc.get('jan');
console.log('Document: ', ' => ', c); //Just to make sure doc.get can be assigned without error to a var
});
runChart();
}
function runChart() {
var d = a;
var e = b;
var f = c;
console.log('runChart: ', ' => ', d, e,f);
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [d, 19, 3, e, f, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
}
问题是对db的所有树调用都是异步的,这意味着在将对这些调用的响应分配给变量之前,将执行runChart。通过使用async/await,您可以实现所需的功能,请参见下面的代码
var a、b、c;
异步函数getFirebase(){
let doc=wait db.collection('metas').doc('meta1097').get()
a=文件获取(“一月”);
doc=wait db.collection('metas').doc('meta1200').get()
b=文件获取(“一月”)
doc=wait db.collection('metas').doc('meta1440').get()
c=文件获取(“一月”)
运行图();
}
函数运行图(){
var d=a;
var e=b;
var f=c;
log('runChart:','=>',d,e,f);
var ctx=document.getElementById('myChart').getContext('2d');
var myChart=新图表(ctx{
类型:'bar',
数据:{
标签:[“红色”、“蓝色”、“黄色”、“绿色”、“紫色”、“橙色”],
数据集:[{
标签:“#投票数”,
数据:[d、19、3、e、f、3],
背景颜色:[
"rgba(255,99,132,0.2)",,
“rgba(54162235,0.2)”,
"rgba(255,206,86,0.2)",,
“rgba(751921920.2)”,
“rgba(153102255,0.2)”,
‘rgba(255、159、64、0.2)’
],
边框颜色:[
"rgba(255,99,132,1)",,
“rgba(54162235,1)”,
"rgba(255,206,86,1)",,
"rgba(751921921)",,
"rgba(153102255,1)",,
‘rgba(255、159、64、1)’
],
边框宽度:1
}]
},
选项:{
比例:{
雅克斯:[{
滴答声:{
贝吉纳泽罗:是的
}
}]
}
}
});
}
请查看一次:a
,b
,c
将在稍后某个时候,当数据库调用完成时填充。你会想看看Promise.all
来等待这三个承诺的完成。来打破它。数据库查询将进入调用堆栈,以便稍后执行。这意味着运行图将在执行“then”中的回调函数之前执行。可以使用async/await或Promissions(使用then方法)。我想象它们在不同的时间被处理,因为javascript的执行是不同的,但我认为我把重点放在了错误的事情上。谢谢大家提供的信息,我们一定会继续学习的。