2013-03-19 28 views
0

我有這樣的代碼,它完美的作品:的getJSON不返回值的函數工作

$.getJSON('/admin/get_acronyms', function(data) { 
    //load JSON 
    $.each(data, function(key, val) { 
     if(key === 'error') { 
      alert(val); 
     } else { 
      //Update typeahead source 
      autocomplete.data('typeahead').source = val; 
     } 
    }); 
}); 

而且我希望它儘量減少這種功能的代碼重用裏面:

var getAndAppendJSON = function(url) { 
    var result; 
    $.getJSON(url, function(data) { 
     $.each(data, function(key, val) { 
      return val; 
     }); 
    }); 
}; 


var arr = getAndAppendJSON('/admin/get_acronyms'); 
autocomplete.data('typeahead').source = arr; 

但此功能不會工作:(。

JS控制檯顯示我,VAR ARR是undefinied

任何人都知道爲什麼?提前致謝。

+1

可能重複[如何從函數返回AJAX調用的響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-電話功能) – 2013-03-19 23:31:49

回答

4

getAndAppendJSON實際上並不返回任何東西。它啓動一個AJAX調用,在調用完成後完成。你應該做的是使用回調裏面的返回數據:

var getAndAppendJSON = function(url) { 
    var result; 
    $.getJSON(url, function(data) { 
     autocomplete.data('typeahead').source = data; 
    }); 
}; 

您的請求將需要一段時間來訪問服務器,並返回。這是處理程序的目的,一旦數據在不確定的時間段之後返回給您,它就能夠處理數據。

+0

非常感謝你@Asad!現在我知道如何使用更好的功能:) – 2013-03-19 23:41:44

+1

@CarlosAzaustre不客氣。請看看Felix Kling提到的問題,它對AJAX中的異步性有很好的解釋。 – 2013-03-19 23:44:04

+0

無論如何,如果我想改變「autocomplete.data('typeahead')。source = data;」爲了其他自動化?提前致謝 – 2013-03-20 11:23:20

3

因爲AJAX是「異步」的。您的AJAX成功處理程序返回val,但您要返回哪裏?

當你執行

var arr = getAndAppendJSON('/admin/get_acronyms'); 

AJAX調用是越來越發送到服務器,但並沒有什麼從函數返回。因此arr未定義。當AJAX調用從服務器返回時,JS的其餘部分很久以前就開始了。

要做到你想達到什麼樣的分配會在回調函數發生:

var getAndAppendJSON = function(url) { 
    var result; 
    $.getJSON(url, function(data) { 
     autocomplete.data('typeahead').source = data; 
    }); 
};