XHR,ajax,axios,fetch傻傻分不清?

相關(guān)定義:

先從AJAX入手,下面的定義很重要:

AJAX(Asynchronous JavaScript And XML )是一種使用 XMLHttpRequest 技術(shù)構(gòu)建更復(fù)雜,動(dòng)態(tài)的網(wǎng)頁的編程實(shí)踐。
AJAX允許只更新一個(gè) HTML 頁面的部分 DOM,而無須重新加載整個(gè)頁面。AJAX還允許異步工作,這意味著當(dāng)網(wǎng)頁的一部分正試圖重新加載時(shí),您的代碼可以繼續(xù)運(yùn)行。
AJAX正在逐漸被 JavaScript 框架中的函數(shù)和官方的 Fetch API 標(biāo)準(zhǔn)取代。

回答 1: AJAX vs Fetch

AJAXFetch都可以訪問和操縱 HTTP 管道(發(fā)出HTTP請(qǐng)求與接收HTTP響應(yīng)),是解決動(dòng)態(tài)網(wǎng)頁的技術(shù)方案

未來發(fā)展方向是Fetch取代AJAX

回答 2: XHR vs AJAX

XHR(XMLHttpRequest)對(duì)象用于與服務(wù)器交互,是AJAX技術(shù)方案的基礎(chǔ),也可以說,使用XHR對(duì)象來發(fā)送一個(gè)Ajax請(qǐng)求。

看看如何使用 XHR 發(fā)送 AJAX請(qǐng)求。

function sendAjax() {
  //構(gòu)造表單數(shù)據(jù)
  var formData = new FormData();
  formData.append('username', 'johndoe');
  formData.append('id', 123456);
  //創(chuàng)建xhr對(duì)象 
  var xhr = new XMLHttpRequest();
  //設(shè)置xhr請(qǐng)求的超時(shí)時(shí)間
  xhr.timeout = 3000;
  //設(shè)置響應(yīng)返回的數(shù)據(jù)格式
  xhr.responseType = "text";
  //創(chuàng)建一個(gè) post 請(qǐng)求,采用異步
  xhr.open('POST', '/server', true);
  //注冊(cè)相關(guān)事件回調(diào)處理函數(shù)
  xhr.onload = function(e) { 
    if(this.status == 200||this.status == 304){
        alert(this.responseText);
    }
  };
  xhr.ontimeout = function(e) { ... };
  xhr.onerror = function(e) { ... };
  xhr.upload.onprogress = function(e) { ... };
  
  // 監(jiān)聽xhr狀態(tài)
  xhr.onreadystatechange = function () {
    try {
       switch(xhr.readyState){
          case 1://OPENED
          break;
          case 2://HEADERS_RECEIVED
          break;
          case 3://LOADING
          break;
          case 4://DONE
          // Everything is good, the response was received.
            if (xhr.status === 200) {
               // Perfect!
            } else {
                // There was a problem with the request.
                // For example, the response may hava a 404 (Not Found)
                // or 500 (Internal Server Error) response code.
             }
           break;
          }
      } catch (e) {
        // 通信錯(cuò)誤的事件中(例如服務(wù)器宕機(jī))
        alert('Caught Exception: ' + e.description)
     }
    
  //發(fā)送數(shù)據(jù)
  xhr.send(formData);
}

回答 3: XHR vs axios

Axios是一個(gè)基于promise的HTTP庫,可以用在瀏覽器和 node.js 中。它本質(zhì)也是對(duì)原生XMLHttpRequest的封裝,只不過是Promise的實(shí)現(xiàn)版本,符合最新的ES規(guī)范。


有了上面的了解,再回頭對(duì)比下AJAXFetch,Fetch有什么優(yōu)缺點(diǎn)呢?

優(yōu)點(diǎn)
  • fetch更加底層,提供的API豐富(requestresponse)
  • fetch基于標(biāo)準(zhǔn)promise實(shí)現(xiàn),支持async/await
缺點(diǎn)
  • 只有網(wǎng)絡(luò)錯(cuò)誤(如斷網(wǎng))才會(huì)調(diào)用reject,而對(duì)400,500這種錯(cuò)誤并不會(huì)reject
  • 默認(rèn)不會(huì)帶cookie,需要添加配置項(xiàng):fetch(url,{credentials:‘include’})
  • 不支持abort,不支持超時(shí)控制或主動(dòng)取消 (XHR支持xhr.ontimeout超時(shí)自動(dòng)取消,也支持xhr.abort()主動(dòng)取消請(qǐng)求)
  • 無法檢測(cè)請(qǐng)求的進(jìn)度(XHR可以)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容