溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解ajax中的async屬性值同步和異步及同步和異步區(qū)別

發(fā)布時間:2021-09-17 16:24:58 來源:億速云 閱讀:163 作者:柒染 欄目:web開發(fā)

這篇文章給大家介紹如何理解ajax中的async屬性值同步和異步及同步和異步區(qū)別,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

jquery中ajax方法有個屬性async用于控制同步和異步,默認(rèn)是true,即ajax請求默認(rèn)是異步請求,有時項目中會用到AJAX同步。這個同步的意思是當(dāng)JS代碼加載到當(dāng)前AJAX的時候會把頁面里所有的代碼停止加載,頁面出現(xiàn)假死狀態(tài),當(dāng)這個AJAX執(zhí)行完畢后才會繼續(xù)運行其他代碼頁面假死狀態(tài)解除。而異步則這個AJAX代碼運行中的時候其他代碼一樣可以運行。

ajax中async這個屬性,用于控制請求數(shù)據(jù)的方式,默認(rèn)是true,即默認(rèn)以異步的方式請求數(shù)據(jù)。

一、async值為true (異步)

當(dāng)ajax發(fā)送請求后,在等待server端返回的這個過程中,前臺會繼續(xù) 執(zhí)行ajax塊后面的腳本,直到server端返回正確的結(jié)果才會去執(zhí)行success,也就是說這時候執(zhí)行的是兩個線程,ajax塊發(fā)出請求后一個線程 和ajax塊后面的腳本(另一個線程)

例如

$.ajax({  
     type:"POST", 
     url:"Venue.aspx?act=init", 
      dataType:"html", 
     success:function(result){  //function1()
       f1(); 
       f2();  
    } 
     failure:function (result) {  
      alert('Failed');  
     }, 
 } 
 function2();

在上例中,當(dāng)ajax塊發(fā)出請求后,他將停留function1(),等待server端的返回,但同時(在這個等待過程中),前臺會去執(zhí)行function2()。

二、async值為false (同步)

當(dāng)執(zhí)行當(dāng)前AJAX的時候會停止執(zhí)行后面的JS代碼,直到AJAX執(zhí)行完畢后時,才能繼續(xù)執(zhí)行后面的JS代碼。

例如

$.ajax({  
     type:"POST", 
     url:"Venue.aspx?act=init", 
     dataType:"html", 
     async: false,
    success:function(result){  //function1()
       f1(); 
       f2(); 
     } 
    failure:function (result) {  
      alert('Failed');  
     }, 
 } 
 function2();

當(dāng)把a(bǔ)syn設(shè)為false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發(fā)出請求后,他會等待在function1()這個地方,不會去執(zhí)行function2(),直到function1()部分執(zhí)行完畢。

Ajax同步與異步的區(qū)別

var returnValue = null; 
xmlhttp = createXmlHttp(); 
xmlhttp.onreadystatechange = function() { 
  if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
    if (xmlhttp.responseText == "true") { 
      returnValue = "true"; 
    } 
    else { 
      returnValue = "false"; 
    } 
  } 
}; 
xmlhttp.open("Post",url,true); //異步傳輸 
xmlhttp.setRequestHeader("If-Modified-Since","0"); //不緩存Ajax
xmlhttp.send(sendStr); 
return returnValue;

在異步時才可以用xmlHttpReq.onreadystatechange狀態(tài)值!下面是異步和同步的不同調(diào)用方式:

Java

xmlHttpReq.open("GET",url,true);//異步方式
  xmlHttpReq.onreadystatechange = showResult; //showResult是回調(diào)函數(shù)名
  xmlHttpReq.send(null);
function showResult(){  
  if(xmlHttpReq.readyState == 4){   
   if(xmlHttpReq.status == 200){
   ******
   }
  }
}

Java

xmlHttpReq.open("GET",url,false);//同步方式  
      xmlHttpReq.send(null);  
      showResult(); //showResult雖然是回調(diào)函數(shù)名但是具體用法不一樣~  
function showResult(){   
       //if(xmlHttpReq.readyState == 4){  這里就不用了,直接dosomething吧~  
        //if(xmlHttpReq.status == 200){  
          ******//dosomething  
        //}  
      //}  
}
xmlhttp.open("Post",url,true);

如果是同步(false),返回值是true或false,因為執(zhí)行完send后,開始執(zhí)行onreadystatechange,程序會等到onreadystatechange都執(zhí)行完,取得responseText后才會繼續(xù)執(zhí)行下一條語句,所以returnValue一定有值。

    如果是異步(true),返回值一定是null,因為程序執(zhí)行完send后不等xmlhttp的響應(yīng),而繼續(xù)執(zhí)行下一條語句,所以returnValue還沒有來的及變化就已經(jīng)返回null了。

    所有如果想獲得xmlhttp返回值必須用同步,異步無法得到返回值。

    同步異步使用xmlhttp池時都要注意:取得xmlhttp時只能新建xmlhttp,不能從池中取出已用過的xmlhttp,因為被使用過的xmlhttp的readyState為4,所以同步異步都會send但不執(zhí)行onreadystatechange。

關(guān)于如何理解ajax中的async屬性值同步和異步及同步和異步區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI