2010-11-20 32 views
1

我不知道如何解釋這個,這使得搜索非常困難(特別是因爲我確定這是思考錯誤)。使用jQuery將AJAX調用重新關聯到原始URL

我有對象的數組:

var a = [ 
    { 
     url: "http://www.discusionboard.com/list-of-boards/", 
     name: "Discussion Board One", 
     threads: [] 
    }, 
    {url: "...", name: "...", threads: [] } 
] 

我通過這些對象的循環,每一個下載頁面,然後試圖添加線程回原來的對象。

for(var i = 0; i < a.length; i++) { 
    jQuery.get(a[i].url, function(result, status, xhr) { 
     /* result is list of threads separated by "[SPLIT]" */ 
     a[i].threads = result.split("[SPLIT]") 
    }); 
} 

我的問題是,[i] .threads中的「i」是未定義的。我找不到一種方法將它傳遞給函數,這讓我覺得我只是從根本上誤解了這裏的一個核心概念。

任何幫助將非常感激。如果有人能夠給我一個我應該尋找的東西的想法,我很高興自己讀一讀。正如你可以看到我的頭銜,我很難描述我想要做什麼。

+0

貌似閉合迴路問題:HTTP://計算器.com/questions/1331769/access-external-variable-in-loop-from-javascript-closure – PleaseStand 2010-11-20 02:47:37

回答

1

這是閉環問題的一個很好的例子。您傳遞給jQuery的回調函數僅在執行完後執行(即使在函數內部返回值後)。因此,a[i](對於回調函數)將始終是數組的最後一個元素。 jQuery.ajax提供context設置來解決這個問題:

for(var i = 0; i < a.length; i++) { 
    jQuery.ajax({ 
     url: a[i].url, 
     context: a[i], 
     success: function(result, status, xhr) { 
      /* result is list of threads separated by "[SPLIT]" */ 
      this.threads = result.split("[SPLIT]") 
     } 
    }); 
} 

請注意,如果您有代碼之後,需要充分利用已完成的對象,這也是一個問題。爲了解決這個問題,你就需要把這個回調函數外:

var numRequests = a.length; 

這在回調函數的末尾:

if(!--numRequests) { 
    // Do whatever now that all object data has been loaded. 
} 
+0

太棒了。我剛剛瞭解了「背景」,它現在只是我所需要的一切,但我看到閉合在其他情況下可能是一個問題。感謝這些例子! – 2010-11-26 20:40:33

相關問題