2011-05-20 47 views
30

我有一個for循環封閉ajax調用,我試圖確定從for循環傳遞索引到回調函數的最佳方法。這是我的代碼:從for循環傳遞索引到ajax回調函數(JavaScript)

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; 

for (var i = 0; i < arr.length; i++) 
{ 
    $.ajaxSetup({ cache:false }) 
    $.getJSON("NatGeo.jsp", { ZipCode: arr[i], Radius: 
      document.getElementById("radius").value, sensor: false },  
      function(data) 
      { 
       DrawZip(data, arr[i]); 
     } 
); 
} 

當前,由於異步ajax調用,只傳遞arr數組的最後一個值。除了同步運行ajax調用之外,如何將arr數組的每次迭代傳遞給回調函數?

+2

雖然這是大約一個重複[30其他問題](http://stackoverflow.com/questions/tagged/javascript+closures+loops),在循環中使用函數時,這是一個非常常見的問題,我希望你不會介意修改其中的一個標籤推數量達到31 :) – Anurag 2011-05-20 20:50:16

回答

60

你可以使用JavaScript關閉:

for (var i = 0; i < arr.length; i++) { 
    (function(i) { 
    // do your stuff here 
    })(i); 
} 

或者你可以只使用$.each

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; 

$.each(arr, function(index, value) { 
    $.ajaxSetup({ cache:false }); 
    $.getJSON("NatGeo.jsp", { ZipCode: value, Radius: 
    document.getElementById("radius").value, sensor: false },  
    function(data) { 
     DrawZip(data, value); 
    } 
); 
}); 
+0

真棒,太棒了!謝謝! – user717236 2011-05-23 17:11:59

+0

這兩個解決方案都是一樣的,沒有什麼價值的,並且'$ .each'沒有什麼不可思議的。在這兩種情況下,都使用匿名函數來創建閉包。 – eradman 2015-04-08 14:22:58

+0

優秀的答案。謝謝。 – 2016-10-21 19:19:18

5

我沒看過的所有30個問題@Anurag上市,但我發現下面的回調語法似乎工作:

(function(year) { 
    return (function(data) {DrawZip(data, year);}); 
})(arr[i]) 

這取代原來的function(data)。順便說一下,結果是隨機的順序,由於異步響應

+0

這也很好。謝謝! – user717236 2011-05-23 17:12:27

+0

非常歡迎。 :) – yitwail 2011-05-25 02:42:40

+0

你節省了我的時間。謝謝。 – seenimurugan 2016-10-20 17:30:41

3

你甚至可以省略爲環支架由John Resig here提到的,我認爲這種方式更具有可讀性

for (var i = 0; i < arr.length; i++) (function(i) { 

    // async processing 
    setTimeout(function(){ 
     console.log(i); 
    }, i * 200); 

})(i);