Javascript 为什么我的变量在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;

我目前正在尝试使用CanvasJS在我的页面上呈现多个图表,并使用AJAX获取表的数据。我在AJAX上使用一个循环来获取数据值,这很好,但在获取AJAX之外的变量值时遇到了问题

这是我遇到的问题:

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;imes=(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
中,我认为您可以通过将请求批量化而不是放入循环来克服这一问题