2010-12-13 88 views
0

我有一個由XHR填充的JSON對象。然後我需要使用來自單獨的XHR調用的值來更新該對象。我遇到的問題是第二次調用不是在正確的時間進行的,我認爲這是我如何構建對象的問題。這裏是我有:JSON對象XHR和閉包

function Proprietary() 
{ 
    var proprietary= this; 
    this.Groups = {}; 
    this.getGroups = function() 
    { 
    $.getJSON(group_url, function(data){proprietary.callReturned(data);}); 

    } 


    this.callReturned = function(data) 
    { 
    //Do stuff 
    for(var i=0; i< data.groups.length; i++) 
    { 
    insparq.Groups[i] = data.groups[i]; 
    $.getJSON(participant_url, function(p){proprietary.Groups[i].participants = p;}); 
    } 

//the function call below is the action I want to occur after the object is populated. 
    PopulateGroups(); 
    } 

}; 
+0

我認爲你在一個名爲'proprietary'的函數內命名一個名爲'proprietary'的變量可能會導致一些問題,你不覺得嗎? – 2010-12-13 06:41:39

+1

'PopulateGroups'在所有'$ .getJSON(participant_url ...')被調用之前,您需要檢查您使用外部計數器加載的參與者數量,並檢查它是否與'proprietary.Groups' '$ .getJSON(participant_url ...'回調函數,只有當它們相等時,你應該調用'PopulateGroups'。 – 2010-12-13 06:50:09

+0

謝謝,Horia。在哪裏/如何增加計數器? – 2010-12-13 06:57:33

回答

1

似乎在該代碼段中有一些奇怪的事情。

首先,$ .getJSON(...)接受第三個參數,這是您的回調。第二個參數是數據。我認爲你傳遞一個函數作爲你的數據參數。你需要在兩個地方解決這個問題。如果你不需要傳遞任何東西,只需要你的第二個參數是一個空對象{}。

下面是您可以在您的所有XMLHttpRequests從服務器返回後執行回調的一種常規方法。

this.callReturned = function(data) { 

    var countdown = data.groups.length; 
    function callback() { 
     if(countdown-- === 1) { 
      PopulateGroups(); 
     } 
    } 

    for(var i=0; i< data.groups.length; i++) 
    { 
     insparq.Groups[i] = data.groups[i]; 
     $.getJSON(participant_url, { /* data to send to server */ }, callback); 
    } 

} 

在這個片段中,回調函數每次你得到一個XMLHttpRequest從服務器返回時執行。最後一個執行PopulateGroups(),倒計數從data.groups.length下降到1。