2011-03-19 81 views
5

我使用jQuery的$.getJSON() API從一組實用程序的給定URL檢索數據。我真的很想找到一種方法來重用每個實用程序的代碼(完全一樣)。由於循環執行時不考慮ajax調用,因此我無法找到保留循環值的方法。循環內的異步

這說明很爛,我知道,所以here'a定義它的代碼片斷好一點:

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + type); 
    }); 
} 

我需要找到一種方式來傳遞的類型值步入回調,所以我可以申請正確的語法。沒有這些,所有3個循環都針對「水」工具執行。我知道爲什麼它是而不是工作,我只是想知道是否有一個合理的解決方法。

謝謝。

回答

4

創建一個封閉

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

function getCallBack(type){ 
    return function(data,status){ 
    alert('Processing ' + type); 
    } 
} 

/** Retrieve known utility providers for the given zip code */ 

for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, getCallBack(type)); 
} 
3

這樣做,同時仍使用匿名閉合的規範的方法是創建立即調用,並通過循環變量,然後一個匿名閉包回報的真正的回調。

這個匿名封閉件具有其自身的範圍包含其自己的變量(包括傳遞的參數),其可以覆蓋外循環的變量,例如:

..., success: (function(type) { 
    return function() { 
     alert(type); 
    } 
}(type)) 

在外部的括號中的type是循環變量。函數聲明中的type參數,它位於新閉包的範圍內。當alert被調用時,它使用範圍最接近的那個,即參數。

當然,該參數可以有自己的變量名稱,它不必與外部範圍中的變量名稱相同!如果不同,那麼兩者都可用,但外部範圍版本將始終具有相同的值。

0

可以分配的「類型」值來爲每個AJAX請求的成員變量,並使用在回調成功函數this關鍵字測試:

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    var jsonReq = $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + this.utilityType); 
    }); 
    jsonReq.utilityType = type; 
}