0

Stackoverflow(ers)、

オブジェクトの配列からのデータを処理する JavaScript 関数を作成しました。この関数では、配列内の各オブジェクトに対して ajax 要求を呼び出して配列を反復処理しています。

ただし、ajax.done() 関数内では、反復のインデックス j を渡す必要があります。ただし、反復の内側では、j は 4 のままですが、反復の外側では、j は反復で正常にカウントされます。以下のコードの i 反復は、各 ajax リクエスト内をループして特定の値を引き出して配列を形成するため、無視できることに注意してください。

.done() ブロック内で j を反復させるために何をする必要があるかを理解するのを手伝ってくれる人はいますか?

ありがとう、ジェイミー

コードに渡されるオブジェクト:

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 に答える