2017-01-17 5 views
1

私はjavascriptの初心者です。forループ内で複数のajax呼び出しを作成しようとしています。ループを通過するたびに、ajax呼び出しのために別のURLを使用して配列の要素をループします。問題は、変数 'test'の値が常に「condition4」に等しいということです。私は他の言語に慣れていますが、 'test'の値は 'condition1'、次に 'condition2'などはforループを通ります。ここに私のコードの簡易版は、次のとおりです。forループ内で複数のajax呼び出しを作成する

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は名前でバインドします。新しいスコープを作成するか、例えば、 'context'を使ってローカル変数を渡すことでローカル変数を閉じないようにします。 –

+0

これはあなたのAjax呼び出しが非同期的に行われているため、成功した時点でループは4になりますので、すべての結果は4 – Pete

答えて

0

私はあなたがループを実行している場合、サーバー

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参照を添付します。次に、非同期タスクのために、終了して '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++; 
 
     } 
 
    }); 
 
     
 
     
 
}

の各値を分離210
+0

になります。ありがとうございました – Simon

関連する問題