0

Stackoverflow(ers),

我创建了一个 javascript 函数,用于处理来自对象数组的数据,在此函数中,我遍历数组,为数组中的每个对象调用 ajax 请求。

但是,在 ajax.done() 函数中,我需要传入迭代的索引 j。然而,在迭代内部,j 停留在 4 上,而在迭代外部,j 在迭代中成功计数。请注意,下面代码中的 i 迭代在每个 ajax 请求内部循环以提取某些值以形成数组,因此可以忽略。

谁能帮我弄清楚我需要做什么才能让 j 在 .done() 块内进行迭代?

谢谢,杰米

传递给代码的对象:

var dataConfig = [
            { targetDiv: "#chart", chartTitle: "Title", tooltipVisible: true, xAxisLabel: "Label", leftYAxisLabel: "Unit"  },
            { apiUrl: "URL", type: "column", yAxis: "right", visibleInLegend: false },
            { apiUrl: "URL", type: "line", yAxis: "left", visibleInLegend: false },
            { apiUrl: "URL", type: "line", yAxis: "left", visibleInLegend: false },

        ];

编码:

for ( var j = 2; j < dataConfig.length; j++ ) {
                console.log(j);
                chartConfig[j] = { 
                    yAxisValues: [], 
                    type: dataConfig[j].type, 
                    yAxis: dataConfig[j].yAxis, 
                    visibleInLegend: dataConfig[j].visibleInLegend
                }
                $.ajax({
                    url: baseURL + dataConfig[j].apiUrl,
                    beforeSend: function ( xhr ) {
                        xhr.setRequestHeader('Authorization', 'yes');
                    }
                }).done(function (data) {
                   //get Y Axis Values
                    var yAxisData = data.DataSeries.Data;
                    yAxisValues = [];
                    for ( var i = 0; i < yAxisData.length; i++ ) {
                        var yAxisValue = yAxisData[i].Y[0];
                        yAxisValues.push(parseInt(yAxisValue, 10));
                    };
                    console.log(yAxisValues);
                    console.log("j:", j);
                    // chartConfig[j].yAxisValues = yAxisValues;
                });

            };
4

1 回答 1

2

AJAX 是异步的。.done() 方法将在最有可能与父 for 循环不同步的点运行,因此您不能依赖变量“j”。

您可以使用以下语法通过在自执行函数中捕获 j 的值来实现您想要的:

for ( var j = 2; j < dataConfig.length; j++ ) {
    (function(index) {
        $.ajax({
            url: baseURL + dataConfig[j].apiUrl,
            beforeSend: ...
        }).done(function(data) { 
           console.log(index); 
        });
    })(j);
}
于 2013-07-24T08:19:21.707 回答