Javascript 从一个函数到另一个函数的全局变量

Javascript 从一个函数到另一个函数的全局变量,javascript,Javascript,在这个文件中,我试图发送从Firebase云中获取的值,并将它们显示在 另一个函数上的图表。问题是,我无法在另一个函数上获取这些值,已经尝试将变量设置为全局变量,但无法工作。我读过多篇关于在javascript中将变量从一个函数发送到另一个函数的文章,但我所做的一切都没有起作用,第二个函数中的控制台日志总是runChart:=>undefined undefined(以及图表没有正确显示,缺少条)。我做错了什么?例如,尝试过像这样的简单解决方案,但什么都没有 var a, b, c; funct

在这个文件中,我试图发送从Firebase云中获取的值,并将它们显示在 另一个函数上的图表。问题是,我无法在另一个函数上获取这些值,已经尝试将变量设置为全局变量,但无法工作。我读过多篇关于在javascript中将变量从一个函数发送到另一个函数的文章,但我所做的一切都没有起作用,第二个函数中的控制台日志总是runChart:=>undefined undefined(以及图表没有正确显示,缺少条)。我做错了什么?例如,尝试过像这样的简单解决方案,但什么都没有

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的执行是不同的,但我认为我把重点放在了错误的事情上。谢谢大家提供的信息,我们一定会继续学习的。