日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
前后端數(shù)據(jù)交互—Ajax、Fetch和Axios優(yōu)缺點(diǎn)及比較

一、ajax、fetch 和 axios 簡介

1.1、ajax

ajax是最早出現(xiàn)發(fā)送后端請(qǐng)求的技術(shù),屬于原生 js 。ajax使用源碼,請(qǐng)點(diǎn)擊《原生 ajax 請(qǐng)求詳解》查看。一般使用之前,我們都需要把它們封裝使用,就以 jQuery 的 ajax 為例。

封裝的 ajax 如下:

 
 
 
  1. const $ = {}; 
  2. $.ajax = (obj)=>{ 
  3.  var xhr; 
  4.  if (window.XMLHttpRequest) { 
  5.   xhr = new XMLHttpRequest(); 
  6.  } else if (window.ActiveXObject) { // IE 
  7.   try { 
  8.    xhr = new ActiveXObject('Msxml2.XMLHTTP'); 
  9.   } catch (e) { 
  10.    try { 
  11.     xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
  12.    } catch (e) {} 
  13.   } 
  14.  } 
  15.  if (xhr) { 
  16.   xhr.onreadystatechange = () =>{ 
  17.    if (xhr.readyState === 4) { 
  18.     if (xhr.status === 200) { 
  19.      obj.success(xhr.responseText); //返回值傳callback 
  20.     } else { 
  21.      //failcallback 
  22.      obj.error('There was a problem with the request.'); 
  23.     } 
  24.    } else { 
  25.     console.log('still not ready...'); 
  26.    } 
  27.   }; 
  28.   xhr.open(obj.method, obj.url, true); 
  29.   // 設(shè)置 Content-Type 為 application/x-www-form-urlencoded 
  30.   // 以表單的形式傳遞數(shù)據(jù) 
  31.   xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
  32.   xhr.send(util(obj.data));//處理body數(shù)據(jù) 
  33.  } 
  34.   
  35.  //處理數(shù)據(jù) 
  36.  const util = (obj)=>{ 
  37.  var str = '' 
  38.  for (key in obj){ 
  39.   str += key +'='+obj[key]+'&' 
  40.   } 
  41.   return str.substring(0,str.length-1) 
  42.  }     

 封裝完成,開始使用的時(shí)候你會(huì)發(fā)現(xiàn),body和header處理得有些亂,還有回調(diào)地獄的問題,所以我們出現(xiàn)了新的 fetch 請(qǐng)求技術(shù)。

1.2、fetch

fetch 首先解決了回調(diào)地獄的問題,他返回的結(jié)果是一個(gè) Promise 對(duì)象,對(duì) Promise 不熟的可點(diǎn)擊《Promise詳解》。

fetch 使用如下:

 
 
 
  1. fetch(url,options).then(response=>{ 
  2. // handle HTTP response 
  3. },error=>{ 
  4. // handle network error 
  5. }) 

fetch 發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí),可以傳輸任意數(shù)據(jù)格式,非常簡便。但是 fetch 的超時(shí)、終止取消并不方便,只能通過取消 Promise 來完成,如果有多個(gè) fetch 請(qǐng)求時(shí),更難處理。除此之外,fetch 是比較新的技術(shù),低版本瀏覽器和IE瀏覽器支持性不好。

1.3、axios

axios 功能非常強(qiáng)大,包括 取消請(qǐng)求,超時(shí)處理,進(jìn)度處理等等。但它的本質(zhì)還是 ajax,基于 Promise 進(jìn)行封裝,既解決回調(diào)地獄問題,又能很好地支持各個(gè)瀏覽器。

axios使用代碼如下:

 
 
 
  1. axios.post('/user', { 
  2.  firstName: 'Fred', 
  3.  lastName: 'Flintstone' 
  4. }) 
  5. .then(function (response) { 
  6.  console.log(response); 
  7. }) 
  8. .catch(function (error) { 
  9.  console.log(error); 
  10. }); 

二、ajax、fetch、axios的優(yōu)缺點(diǎn)

2.1、ajax 的優(yōu)缺點(diǎn):

  • 屬 js 原生,基于XHR進(jìn)行開發(fā),XHR 結(jié)構(gòu)不清晰。
  • 針對(duì) mvc 編程,由于近來vue和React的興起,不符合mvvm前端開發(fā)流程。
  • 單純使用 ajax 封裝,核心是使用 XMLHttpRequest 對(duì)象,使用較多并有先后順序的話,容易產(chǎn)生回調(diào)地獄。

2.2、fetch 的優(yōu)缺點(diǎn):

  • 屬于原生 js,脫離了xhr ,號(hào)稱可以替代 ajax技術(shù)。
  • 基于 Promise 對(duì)象設(shè)計(jì)的,可以解決回調(diào)地獄問題。
  • 提供了豐富的 API,使用結(jié)構(gòu)簡單。
  • 默認(rèn)不帶cookie,使用時(shí)需要設(shè)置。
  • 沒有辦法檢測請(qǐng)求的進(jìn)度,無法取消或超時(shí)處理。
  • 返回結(jié)果是 Promise 對(duì)象,獲取結(jié)果有多種方法,數(shù)據(jù)類型有對(duì)應(yīng)的獲取方法,封裝時(shí)需要分別處理,易出錯(cuò)。
  • 瀏覽器支持性比較差。

2.3、axios的優(yōu)缺點(diǎn):

  • 在瀏覽器中創(chuàng)建XMLHttpRequest請(qǐng)求,在node.js中創(chuàng)建http請(qǐng)求。
  • 解決回調(diào)地獄問題。
  • 自動(dòng)轉(zhuǎn)化為json數(shù)據(jù)類型。
  • 支持Promise技術(shù),提供并發(fā)請(qǐng)求接口。
  • 可以通過網(wǎng)絡(luò)請(qǐng)求檢測進(jìn)度。
  • 提供超時(shí)處理。
  • 瀏覽器兼容性良好。
  • 有攔截器,可以對(duì)請(qǐng)求和響應(yīng)統(tǒng)一處理。

分享名稱:前后端數(shù)據(jù)交互—Ajax、Fetch和Axios優(yōu)缺點(diǎn)及比較
URL分享:http://www.5511xx.com/article/dhsopeg.html