
[英]Why this function returns cannot read undefined variable while the variable is actually defined?
[英]Undefined variable javascript; While actually defined
我在使用此代码时遇到麻烦:
google.charts.load('current', {
packages: ['corechart', 'line']
});
google.charts.setOnLoadCallback(drawBasic);
function time(dati) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
dati = [];
dati.push(JSON.parse(this.responseText));
console.log(dati); //logs perfectly fine
return dati;
};
};
xmlhttp.open("GET", "graph-data.php", true);
xmlhttp.send();
};
time();
console.log(dati); // logs nothing
function drawBasic(dati) {
var data = new google.visualization.DataTable();
data.addColumn('number', 'X');
data.addColumn('number', 'Prijs');
console.log(dati); //logs nothing
data.addRows(dati);
var options = {
hAxis: {
title: 'Time'
},
vAxis: {
title: 'Prijs'
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
变量未定义。 如何定义它们?
您会收到此错误,因为dati
是一个未声明的变量,您正在尝试在第17行获取值:
console.log(dati);
该代码出现的地方没有范围内的dati
标识符。 您在time
函数中有一个dati
参数 ,但这仅在您的time
函数中。 上面的线在它外面。
解决该问题后,这里将解决您的下一个问题: 如何返回异步调用的响应? time
启动了异步操作,当time
返回时,该操作尚未完成。
您似乎还期望setOnLoadCallback
将某些内容传递给drawBasic
函数:
google.charts.setOnLoadCallback(drawBasic);
我找不到它的文档(!!),但是此页面的示例未显示接受任何参数的调用函数。
有点猜测,但是我怀疑您想做这样的事情; 查看内联评论:
// A scoping function so we don't create globals
(function() {
// Variables for the data and a loaded flag
var dati = null;
var loaded = false;
// A function we can call from both async operations to see if both have completed
function checkReady() {
if (dati && loaded) {
// They're both done, we can draw
drawBasic(dati);
}
}
// Load charts and get callback when done
google.charts.load('current', {
packages: ['corechart', 'line']
});
google.charts.setOnLoadCallback(function() {
loaded = true;
checkReady();
});
// Load our data
function time() { // <== Note no `dati` parameter, we want to use the variable declared above
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Fill in the data -- are you sure you really want an array with the data
// as its only entry?
dati = [];
dati.push(JSON.parse(this.responseText));
// If we're ready, draw
checkReady();
};
};
xmlhttp.open("GET", "graph-data.php", true);
xmlhttp.send();
};
time(); // Start the data load
function drawBasic(dati) {
var data = new google.visualization.DataTable();
data.addColumn('number', 'X');
data.addColumn('number', 'Prijs');
console.log(dati); //logs nothing
data.addRows(dati);
var options = {
hAxis: {
title: 'Time'
},
vAxis: {
title: 'Prijs'
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
})(); // The end of the scoping function, and `()` to invoke it
我敢肯定这并不完美,但希望它能使您正确地前进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.