2016-02-27 122 views
0

它看起來像我的循環正在循環最後一個分析到所有領域的對象。爲什麼我的循環凍結?

http://codepen.io/anon/pen/EKxNaN

這是我使用實際的代碼,我建立什麼樣的類似的codepen因爲在codepen我不能從實際源請求JSON。

var championMasteryPHP = "https://api.myjson.com/bins/xked"; 

$.getJSON(championMasteryPHP, function (json) { 
    for (var i = 0; i < json.length; i++) { 
     var champID = json[i].championId; 
     var champLevel = json[i].championLevel; 
     var pointstonextlevel = json[i].championPointsUntilNextLevel; 
     var championInfo = "http://example.com/champInfo.php?champid=" + champID; 

     $.getJSON(championInfo, function (json2) { 
      var champName = json2.name; 
      var champTitle = json2.title; 
      $('#champ').append("<li>ID: " + champID + " | Name: " + champName + " | Level: " + champLevel + " | Points to Next Level: " + pointstonextlevel + "</li>"); 
     }); 
    }; 
}); 

長話短說,我試圖實現的是這樣的。

image0

但由於某些原因,這是我得到的替代。

image1

正確的名稱,但其他變量是在列表中最後一個變量。

有沒有更好的方法來做到這一點?我在做一些非常錯誤的事情嗎?

謝謝。

+2

我敢肯定問題是你在for循環中有一個異步函數,當調用異步函數時,所有引用相同的索引值。http://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript-for-loop –

+0

可能重複的htt p://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript-for-loop – JagsSparrow

+0

這是一個'臭名昭着的循環問題'。讓我發表我的回答 –

回答

2

您正在使用異步過程一個javascript在for循環more info here

可以修改使用自執行功能,所以它會工作

var championMastery = "https://api.myjson.com/bins/xked"; 
$.getJSON(championMastery, function (json) { 
for (var i = 0; i < json.length; i++) { 

    (function(obj){ 
     var champID = obj.championId; 
     var champLevel = obj.championLevel; 
     var pointstonextlevel = obj.championPointsUntilNextLevel; 
     var championInfo = "http://example.com/champInfo.php?champid=" + champID; 

      $.getJSON(championInfo, function (json2) { 
       var champName = json2.name; 
       var champTitle = json2.title; 
       $('#champ').append("<li>ID: "+champID+" | Name: " +champName+ " | Level: " +champLevel+ " | Points to Next Level: " +pointstonextlevel+ "</li>"); 
      }); 
    })(json[i]) 
}; 
}); 
+0

美麗!這似乎解決了這個問題。 雖然問得很快,但是 你知道爲什麼現在附件在頁面上顯示時失靈嗎? http://i.imgur.com/4X8K5Rt.png – Zlkva

+0

'$ .getJSON'是異步函數,所以'$('#champ')。append'將取決於服務器的響應。您也可以檢查[async](https://github.com/caolan/async)庫來緩解問題 – JagsSparrow

1

這是我近來看到一篇非常好的文章。詳細的關於Javascript Scope ans Closures。這是一個必須知道的東西在JavaScript,JQuery編碼。而對上述問題有解釋的部分是尋找下的話題臭名昭着的循環問題

現在就要到這個問題了。您的代碼實際上應該看起來像

$.getJSON(championInfo, function (json2) { 
      (function(){ 
       var champName = json2.name; 
       var champTitle = json2.title; 
       $('#champ').append("<li>ID: "+champID+" | Name: " +champName+ " | Level: " +champLevel+ " | Points to Next Level: " +pointstonextlevel+ "</li>");    
      })() 
      }); 

記下我已經加入了自我執行功能的變化。你得到奇怪的輸出與所有功能相同的輸出的問題是因爲。

  • 您的功能$.getJSON回調函數只是一個函數定義,此時不執行函數。當你的第一個getJSON接到它的回調函數時,你的for循環完成,並且變量中的最後一個值是最後一個循環,因此當你的第一個回調函數觸擊它的回調函數時,它顯示最後一個循環的值。

使其更簡單。把它寫在你的控制檯窗口中。

function alert1(){ alert("I am one!!");} 

現在叫/做

alert1(); 

執行該功能你會得到一個警告說:「我是一個!「

現在這個添加到控制檯

function alert1(){ alert("I am one, But overritten!!");} 

然後再嘗試調用它。該出認沽將是‘我是一個,但overritten !!’,因此函數實際上被覆蓋,而這正是最後一個函數是可用於所有回調函數的函數