2012-11-11 70 views
1

我是新來的異步Javascript調用,所以我很難搞清楚如何在getJSON調用修改某個對象的數據後訪問它。在異步jQuery getJSON調用之後訪問變量

我有一個空數組(單詞)和mainMethod和subMethod的對象。 mainMethod獲取一些JSON並根據JSON數據多次調用subMethod。 subMethod訪問不同的JSON文件並使用它來填充對象的空數組(單詞)。

當我創建對象時,我調用mainMethod。我想獲取對象的數組,但只有在它被JSON調用填充後。

我知道它必須使用延遲方法或其他方法做些事情,但我一直在調用中得到一個空白數組。我該怎麼做呢?謝謝!

代碼對象:

function Something(numTerms){ 
     var self=this; 
     this.words=[]; 
     this.wordsNeeded=numTerms; 
     this.mainMethod = function(){ 
      $.getJSON("external JSON url", function(data) { 
       var setIds=self.getDifferentSets(data, self.wordsNeeded).ids; 
       for(var i=0; i<setIds.length; i++){ 
        self.subMethod(setIds[i]); 
       } 

      }); 
     } 
    this.getDifferentSets= function(data, num){ 
     var obj= {}; 
     obj.ids=[]; 
     obj.wordsFound=0; 
     var currSet=0; 
     while(obj.wordsFound<num){ 
       obj.ids.push(data.sets[currSet].id); 
       obj.wordsFound+=data.sets[currSet].term_count; 
       currSet++; 
     } 
     return obj; 
    } 
     this.subMethod= function(id){ 
      $.getJSON("some other external JSON url", function(data) { 
       var numberTerms= data.terms.length; 
       var terms=[]; 
       if(self.wordsNeeded<numberTerms) numberTerms=self.wordsNeeded; 

       for(var i=0;i<numberTerms;i++){ 
        var word= new Object(); 
        word.term=data.terms[i].term; 
        word.definition=data.terms[i].definition; 
        terms.push(word); 
       } 
       for(var i=0;i<terms.length;i++){ 
        var word= {"term":terms[i].term, "definition":terms[i].definition}; 
        self.words.push(word); //Changing the object's variable 
       } 
       self.wordsNeeded-=numberTerms; 
      }); 
     } 
    } 

創建對象:

$(document).ready(function(){ 
     $("#fetch_button").click(function(){ 
      var num=Number($("#numTerms").val()); 
      var some= new Something(num); 
      some.mainMethod(); 
      var words=some.words; //How can I get the final value of some.words AFTER it has been changed by the JSON calls? 
     }); 
    }) 
+0

當調用some.mainMethod(),在你的提取buttin,這個任務是異步的,這意味着var之後的單詞不會等待調用完成並且som電子詞將是空的。爲了正確獲取數據,需要在接收到數據後調用另一個函數,該函數附加到getJson – yumyum

+0

附帶的函數中。但是,如何在接收到我的$中的數據後訪問此另一個函數的結果(「#fetch_button」)。點擊塊? –

+0

你不能直接調用它,因爲它是異步的,你需要等待:)。這就是爲什麼你必須聲明一個新功能。例如:用戶點擊按鈕後,出現一個進度條,你可以調用getJson函數,一旦完成,你可以獲取數據,隱藏進度條,並最終訪問剛剛獲得的數據。 – yumyum

回答

0

你可以嘗試return this在主函數

function Something(numTerms){ 
    var self=this; 
    //Blah blah blah 

    return this; 
} 
+0

好吧,我試過了。然後,如果我做了console.log(some),它確實表明Something確實有合適的單詞數量。但是,然後,我嘗試console.log(some.words)它仍然返回undefined。 –

相關問題