2011-12-19 67 views
1

這可能很明顯,但我無法弄清楚。如何使函數返回它的內函數的值?

我需要使函數返回它的內函數的值。換句話說,我有必須返回JSON對象的函數get_users()。該JSON對象由$.post(內置jQuery)獲取。

function get_users() {  
    return 
     $.post(
      url_base + 'travel/trip/get_users/' + trip_id, 
      function(response) {  
       return response;  
      }, 
      'json' 
     );  
} 

(以上是我試圖這樣做,但它返回undefined - 一個驚喜)

由於變量的作用域的,我不能只讓變量內部函數,因爲它是不可見的在主要功能。我不想使用全局變量。尋找更好的解決方案!

謝謝你的任何建議!

+0

'post'是異步的,因此你不能像你想要做的那樣返回值。如果你真的需要這個,儘管我沒有建議它,請將ajax調用設置爲同步[async:false](http://api.jquery.com/jQuery.ajax/)。 – Yoshi 2011-12-19 08:54:37

+1

這不是一個簡單的範圍界定問題。 AJAX調用是異步的。這裏發生的是1.您調用get_users,它發送一個Ajax請求。 get_users現在完成。 2.在不久的將來,這個AJAX請求被返回,並且你指定的回調函數被運行(在這種情況下,你的回調沒有做任何特別有趣的事情)。 – Asmor 2011-12-19 08:56:57

回答

2

您需要了解異步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選項。

5

你爲什麼要對抗AJAX的異步性?當你做AJAX時,你應該習慣於使用事件和回調,而不是編寫順序代碼。你不能返回內部內容。這樣做的一個簡單的原因是,這個內部函數可能比外部函數執行晚得多。所以外部函數會在執行成功回調之前返回一個結果。

所以這裏的正確方法:

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // instead of trying to return anything here 
      // simply do something with the response 
      // Depending on what the server sent you there 
      // will be different ways. 

      // Here you could also call some other custom function 
      // and pass it the response 
     } 
     'json' 
    ); 
} 
+0

我只是在學習...一個例子將不勝感激。 – daGrevis 2011-12-19 08:54:48

+0

@daGrevis,當然,我已經用一個例子更新了我的答案。 – 2011-12-19 08:57:49

3

無法從Ajax調用返回值。 (如果不設置異步錯誤,但不會真的是AJAX)

通過你打內部返回時,外功能已經完成

您將需要使用一個回調來處理用戶。

get_users(function(response) { // this anonymous function is passed in as a parameter 
    // do something with the response 
}); 

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // call the passed in function and pass in the response as a parameter 
      callback(response);  
     }, 
     json' 
    ); 
} 
+0

如果不需要額外的工作*,可以直接使用'callback',而不用第二個匿名函數。 :) – Yoshi 2011-12-19 09:12:40