2013-01-30

JQuery ajax response值給與另一變數的用法

我們都知道,ajax可以得到由另一個url回饋的東西,但有時候並非會直接在ajax的success中使用,我們把值丟給另一個變數…

而通常我們(其實只有我自己?)下意識的寫法會這樣
var ajax_response = "";
$.ajax({
   url: http://xxx.xxx.xxx.xxx/xxx.xxx,
   success: function(msg) {
      ajax_response = msg;
   }
});
alert(ajax_response);
但其實ajax中的success的ajax_response與外層的ajax_response是不相干,應該說是同一個ajax_response,但在這種寫法底下msg並沒有丟到ajax_response

原因在:http://api.jquery.com/jQuery.ajax/
jquery在ajax的async屬性中寫到,預設是非同步發送(By default, all requests are sent asynchronously)

那何謂非同步發送(或稱異步發送),其實就是為了保持頁面的執行效率,所以在ajax發送過程到url-server回應的中間,script會持續的往下運作,以免發生url-server timeout時間過久導致頁面delay的狀況。

但如同我們上述的寫法,在非同步的前提下,ajax_response是必須等到url-server回應之後才會取得msg(ajax的回饋),所以我們在alert(ajax_response)時會是空值…因為在alert之前,一般的url-server都沒有那麼快的回饋。

如果我們要改為同步,也就是必須先拿到ajax_response的話,只要在ajax的屬性中加上async: false即可。

沒有留言: