2017-01-17 6 views
1

Я относительный новичок в javascript, и я пытаюсь сделать несколько вызовов ajax в цикле for. Он перебирает элементы массива с использованием другого URL-адреса для вызова ajax каждый раз, когда он проходит через цикл. Проблема в том, что значение переменной «test» всегда равно «condition4». Я привык к другим языкам, где значение «test» будет «condition1», затем «condition2» и т. Д., Когда оно проходит через цикл for. Вот упрощенная версия моего кода:создание нескольких вызовов ajax в цикле for

var myData = []; 
var cnt = 0; 
var link; 
var myCounter = 0; 
var myArray = ["condition1", "condition2", "condition3", "condition4"]; 

for (x = 0; x < myArray.length; x++) { 
    link = "https://test.com/" + myArray[x]; 
    myCounter = x; 
    GetJSON(function (results) { 
     for (i = 0; i < results.data.length; i++) { 
      var id = results.data[i].identifier; 
      var test = myArray[myCounter]; 
      myData[cnt] = { "id": id, "test": test }; 
      cnt++; 
     } 
    }); 
} 

function GetJSON(callback) { 
    $.ajax({ 
     url: link, 
     type: 'GET', 
     dataType: 'json', 
     success: function (results) { 
      callback(results); 
     } 
    }); 
} 
+0

Это же старая история, JS связывается по имени. Создайте новую область или избегайте локализации локальных варов, передавая их, используя, скажем, «контекст». –

+0

Это потому, что ваши вызовы ajax выполняются асинхронно, поэтому к моменту вашего успеха цикл достигнет 4, поэтому все ваши результаты будут 4 – Pete

ответ

0

Я думаю, вы можете решить эту проблему путем отправки и получения MYCounter значения для сервера

for (x = 0; x < myArray.length; x++) { 
 
    link = "https://test.com/" + myArray[x]; 
 
    myCounter = x; 
 
    $.ajax({ 
 
    url: link, 
 
    type: 'GET', 
 
    dataType: 'json', 
 
    data: { myCounter: myCounter} 
 
    success: function(results) { 
 
     for (i = 0; i < results.data.length; i++) { 
 
     var id = results.data[i].identifier; 
 
     var test = results.data[i].myCounter 
 
     myData[cnt] = { 
 
      "id": id, 
 
      "test": test 
 
     }; 
 
     cnt++; 
 
     } 
 
    } 
 
    }); 
 

 
}

1

При выполнении цикла , он присоединяет ссылку myCounter. Затем, из-за асинхронной задачи, когда она заканчивается и вызывается «myCounter», она уже достигла числа 4. Итак, когда он вызывает «myCounter», это 4. Чтобы изолировать область действия, вам нужно создать новую область каждая итерация и изолируя каждое значение '' MyCounter

for (x = 0; x < myArray.length; x++) { 
 
    link = "https://test.com/" + myArray[x]; 
 
    myCounter = x; 
 
    //IIFE 
 
    (function() { 
 
     var ownCounter = myCounter; //Isolating counter 
 
     GetJSON(function (results) { 
 
     for (i = 0; i < results.data.length; i++) { 
 
      var id = results.data[i].identifier; 
 
      var test = myArray[ownCounter]; 
 
      myData[cnt] = { "id": id, "test": test }; 
 
      cnt++; 
 
     } 
 
     }); 
 
     
 
    })(); 
 
    
 
}

Или ...

for (let x = 0; x < myArray.length; x++) { 
 
    link = "https://test.com/" + myArray[x]; 
 
    myCounter = x; 
 
    
 
    GetJSON(function (results) { 
 
     for (i = 0; i < results.data.length; i++) { 
 
      var id = results.data[i].identifier; 
 
      var test = myArray[x]; 
 
      myData[cnt] = { "id": id, "test": test }; 
 
      cnt++; 
 
     } 
 
    }); 
 
     
 
     
 
}

+0

Это работает отлично. спасибо – Simon

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