2013-07-24 2 views
0

StackOverflow (ERS),Как получить переменные в JQuery Ajax .done()

Я создал яваскрипт функцию, в которой для обработки данных из массива объектов, и в этой функции я итерация через массив, вызывающий ajax-запрос для каждого объекта в массиве.

Однако внутри функции ajax.done() мне нужно передать индекс итерации j. Внутри итерации, однако, j застрял на 4, тогда как вне итерации j успешно учитывает итерацию. Обратите внимание, что итерация i в приведенном ниже коде проходит через каждый запрос ajax, чтобы вытащить определенные значения для формирования массива, поэтому его можно игнорировать.

Может ли кто-нибудь помочь мне в разработке того, что мне нужно сделать, чтобы выполнить итерацию внутри блока .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; 
       }); 

      }; 

ответ

2

AJAX является асинхронным. Метод .done() будет работать в точке, которая, скорее всего, не синхронизирована с родительским циклом, поэтому вы не можете полагаться на переменную 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); 
} 
+0

отлично работает, спасибо! – Jamie

Смежные вопросы