Ajax同步和異步的區別

以前一直在寫JQUERY代碼的時候遇到AJAX加載數據都須要考慮代碼運行順序問題。 最近的項目用了到AJAX同步。這個同步的意思是當JS代碼加載到當前AJAX的時候會把頁面裏全部的代碼中止加載,頁面出去假死狀態,當這個AJAX執 行完畢後纔會繼續運行其餘代碼頁面假死狀態解除。
而異步則這個AJAX代碼運行中的時候其餘代碼同樣能夠運行。
jquery的async:false,這個屬性
默認是true:異步,false:同步。html

$.ajax({  jquery

        type: "post",  ajax

       url: "path",  瀏覽器

       cache:false,  app

       async:false,  異步

        dataType: ($.browser.msie) ? "text" : "xml",  async

         success: function(xmlobj){  post

        }  動畫

});this

有了這個屬性能夠相對的減小代碼運行書序問題,可是若是用的太多,頁面假死次數太多。這樣反而致使用戶體驗不佳~!

$.Ajax()中 async 和success的官方的解釋:

async
Boolean
Default: true

By default, all requests are sent asynchronous (e.g. this is set to true by default). If you need synchronous requests, set this option to false. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.

success
Function

A function to be called if the request succeeds. The function gets passed two arguments: The data returned from the server, formatted according to the 'dataType' parameter, and a string describing the status. This is an Ajax Event.

 

在 這裏,async默認的設置值爲true,這種狀況爲異步方式,就是說當ajax發送請求後,在等待server端返回的這個過程當中,前臺會繼續 執行ajax塊後面的腳本,直到server端返回正確的結果纔會去執行success,也就是說這時候執行的是兩個線程,ajax塊發出請求後一個線程 和ajax塊後面的腳本(另外一個線程)例:

$.ajax({  

          type:"POST", 

         url:"Venue.aspx?act=init", 

           dataType:"html", 

          success:function(result){   //function1()

             f1(); 

             f2(); 

        } 

         failure:function (result) {  

            alert('Failed');  

         }, 

  } 

  function2(); 

在上例中,當ajax塊發出請求後,他將停留function1(),等待server端的返回,但同時(在這個等待過程當中),前臺會去執行function2(),也就是說,在這個時候出現兩個線程,咱們這裏暫且說爲function1() 和function2()。

          當把asyn設爲false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發出請求後,他會等待在function1()這個地方,不會去執行function2(),知道function1()部分執行完畢。

 

以前一直覺得只要同步就行了.其實若是同步就失去了ajax的意義.

遇到一個bug.

頁面的加載  加載中.....   引用一個publish.js

 1 function loader(m) {
 2 var left = (window.innerWidth / 2) - 83;
 3 var top = window.innerHeight / 2 - 60;
 4 var height = 50;
 5 var html =
 6 '<div id="ajaxloader_zz" style="z-index: 9999998; position: absolute; top: 0px; left: 0; width: 100%; height: 100%; opacity: 0; "></div>' +
 7 '<div id="ajaxloader" style="width:200px;height:100px; text-align:center;background-color:snow;border-radius:5px; position:fixed;top:' + top + 'px;left:' + left + 'px;z-index:9999999;">' +
 8 '<table style="vertical-align:middle;text-align:center; width:100%;height:100%;">' +
 9 '<tr><td><div style="margin-top:20px;"><img src="../images/loading.gif" /></div></td></tr>' +
10 '<tr><td><span style="color:black;font-family:Helvetica-Regular;font-weight:bold;font-size:16px">' + m + '</span></td></tr></table></div>';
11 return html;
12 }
13 
14 //請求開始動畫
15 $(document).ajaxSend(function () {
16 alert(1);
17 if ($("#ajaxloader").length == 0) {
18 $("body").append(loader("請稍候..."));
19 $("#ajaxloader,#ajaxloader_zz").fadeIn("normal");
20 }
21 });
22 
23 ////請求成功動畫
24 $(document).ajaxSuccess(function () {
25 if ($("#ajaxloader").length > 0) {
26 $("#ajaxloader,#ajaxloader_zz").fadeOut("normal");
27 $("#ajaxloader,#ajaxloader_zz").remove();
28 }
29 });
30 //請求錯誤動畫
31 $(document).ajaxError(function () {
32 if ($("#ajaxloader").length > 0) {
33 $("#ajaxloader,#ajaxloader_zz").fadeOut("normal");
34 $("#ajaxloader,#ajaxloader_zz").remove();
35 $("body").append(loader("請求失敗!"));
36 $("#ajaxloader,#ajaxloader_zz").fadeIn("normal");
37 setTimeout(function () { $("#ajaxloader,#ajaxloader_zz").fadeOut("normal"); $("#ajaxloader,#ajaxloader_zz").remove(); }, 1000);
38 }
39 });

頁面引用這個js.當有ajax操做時,會有請稍等....的提示

若是頁面中使用的ajax請求是同步的.在google和ie等瀏覽器上不會有此效果.改成異步便可.

注意:添加async:false.即修改成同步了,什麼意思?(按同事解釋就是,這是等這個ajax有了返回值後纔會執行下面的js。一語道破天機,怪不得之前不少ajax調用裏面的賦值都不起做用)。這樣等ajax給bol賦值完畢後,才執行下面的js部分。而剛剛異步的話,尚未來得及賦值,就已經return了。

考慮是否是由於設置爲同步時,影響了publish.js中的js執行.可是火狐中又能夠,哎,理解不透了.

相關文章
相關標籤/搜索