我是新來的異步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?
});
})
當調用some.mainMethod(),在你的提取buttin,這個任務是異步的,這意味着var之後的單詞不會等待調用完成並且som電子詞將是空的。爲了正確獲取數據,需要在接收到數據後調用另一個函數,該函數附加到getJson – yumyum
附帶的函數中。但是,如何在接收到我的$中的數據後訪問此另一個函數的結果(「#fetch_button」)。點擊塊? –
你不能直接調用它,因爲它是異步的,你需要等待:)。這就是爲什麼你必須聲明一個新功能。例如:用戶點擊按鈕後,出現一個進度條,你可以調用getJson函數,一旦完成,你可以獲取數據,隱藏進度條,並最終訪問剛剛獲得的數據。 – yumyum