您需要了解異步ajax調用的工作原理。
當您撥打$.post()
時,它會啓動網絡電話進行發佈,並立即從$.post()
呼叫返回並繼續執行其餘的javascript。它甚至會立即退出你的功能get_users()
。
但是,ajax調用還沒有完成 - 它仍在進行中。一段時間後,ajax調用將完成,當發生這種情況時,將調用您定義爲function(response) {...}
的ajax調用的成功處理程序。只有在那個時候,纔會有來自已知的ajax調用的響應值。
這就是異步ajax的意思。你不能寫一個像get_users()這樣的調用,並期望它獲得用戶並隨它們一起返回。相反,你必須利用回調函數,這些函數稍後會調用(當ajax完成時),然後你可以繼續代碼的路徑。是的,這很不方便,但這是javascript與異步ajax調用一起工作的方式。異步ajax調用的好處在於,在ajax調用正在進行時,瀏覽器和其他javascript代碼可以完全處於活動狀態。異步ajax調用的代價是編碼更復雜。
對於如何處理這種併發症,您有多種選擇。首先,您可以調用get_users(),然後繼續在get_users()
內部回調中執行的編程序列,因爲這是響應(實際用戶)唯一知道的地方。如果你只在代碼中的一個地方使用get_users()
,那麼這可以很好地工作。當Ajax調用
function get_users() {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
},
'json'
);
}
如果您需要在幾個不同的地方爲了不同的目的使用get_users()
,那麼你可以改變它採取回調本身,讓後期的調用只是調用回調函數:它是這樣的已經完成了。這樣,你會完成處理在回調函數的響應:
function get_users(callback) {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
callback,
'json'
);
}
在這第二個選項,你可以調用get_users()
這樣的:
get_users(function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
});
還有更先進的可使用jQuery's deferred object選項。
'post'是異步的,因此你不能像你想要做的那樣返回值。如果你真的需要這個,儘管我沒有建議它,請將ajax調用設置爲同步[async:false](http://api.jquery.com/jQuery.ajax/)。 – Yoshi 2011-12-19 08:54:37
這不是一個簡單的範圍界定問題。 AJAX調用是異步的。這裏發生的是1.您調用get_users,它發送一個Ajax請求。 get_users現在完成。 2.在不久的將來,這個AJAX請求被返回,並且你指定的回調函數被運行(在這種情況下,你的回調沒有做任何特別有趣的事情)。 – Asmor 2011-12-19 08:56:57