Javascript 为什么我的变量在ajax请求中重置?
我目前正在尝试使用CanvasJS在我的页面上呈现多个图表,并使用AJAX获取表的数据。我在AJAX上使用一个循环来获取数据值,这很好,但在获取AJAX之外的变量值时遇到了问题 这是我遇到的问题:Javascript 为什么我的变量在ajax请求中重置?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我目前正在尝试使用CanvasJS在我的页面上呈现多个图表,并使用AJAX获取表的数据。我在AJAX上使用一个循环来获取数据值,这很好,但在获取AJAX之外的变量值时遇到了问题 这是我遇到的问题: for(var i = 0; i < nMeses; i++) { var mes = dtIni.addMonths(i); var ano = mes.getFullYear(); mes = mes.getMonth()+1;
for(var i = 0; i < nMeses; i++) {
var mes = dtIni.addMonths(i);
var ano = mes.getFullYear();
mes = mes.getMonth()+1;
mes = (mes<10 ? '0' : '') + mes;
var res = ano + mes;
console.log(res);
$.ajax({
url: "getMesGrafico.php",
type: "GET",
dataType: "json",
data: {"m": mes},
success: function(data) {
console.log(res);
var chart = new CanvasJS.Chart("body"+res, {
animationEnabled: true,
theme: "light1", // "light1", "light2", "dark1", "dark2"
title:{
text: "Gráfico de contas a pagar do mês"
},
data: [{
type: "column", //change type to bar, line, area, pie, etc
dataPoints: data
}]
});
chart.render();
},
error: function(data) {
console.log("Error");
}
});
}
for(变量i=0;i mes=(messuccess我正在成功地获取我想要的数据,但我无法获得“res”的正确值。我的控制台输出当前为:201912 202001 202001 202001
,但我正在试图理解为什么第一个值和第二个值不同,因为它们位于同一个循环中。我使用jquery已经很久了,但是:
$.ajax()是一个异步函数,这意味着它只发出请求并继续运行,而不等待响应,这就是为什么需要在“成功”回调中指定代码的原因
如果希望“res”变量同步更新,则应使用轮询函数发出异步请求
发出请求,等待响应,增加计数器并再次调用函数
下面是一个例子:
let i = 0;
(function poll(){
var mes = dtIni.addMonths(i);
var ano = mes.getFullYear();
mes = mes.getMonth()+1;
mes = (mes<10 ? '0' : '') + mes;
var res = ano + mes;
console.log(res);
$.ajax({
url: "getMesGrafico.php",
type: "GET",
dataType: "json",
data: {"m": mes},
success: function(data) {
console.log(res);
var chart = new CanvasJS.Chart("body"+res, {
animationEnabled: true,
theme: "light1", // "light1", "light2", "dark1", "dark2"
title:{
text: "Gráfico de contas a pagar do mês"
},
data: [{
type: "column", //change type to bar, line, area, pie, etc
dataPoints: data
}]
});
chart.render();
//once the request is done, increase "i" and call poll() again
i++;
if(i < nMeses)
poll();
},
error: function(data) {
console.log("Error");
}
});
})();
设i=0;
(函数poll(){
var mes=dtIni.addMonths(i);
var ano=mes.getFullYear();
mes=mes.getMonth()+1;
人工编码站=(问题是因为在循环的每次迭代中都会更新res
的值。AJAX调用会在循环完成后的某个时间点返回,res
只是它的最终值。请记住,AJAX成功返回是异步的,因此通过使用for循环构建一组AJAX调用,res
variable将以这些成功何时真正回来为基础。将ajax放入循环中总是有问题的。您必须设计一种不同的方式来实现您想要的。也许可以使用递归ajax调用(在成功处理程序中,检查特定条件,如果不满足,再次调用ajax,等等)最简单的“破解”方法是将res
传递给getMesGrafico.php
,然后让getMesGrafico.php
将res
值返回到data
中,我认为您可以通过将请求批量化而不是放入循环来克服这一问题