自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

前后端數(shù)據(jù)交互—Ajax 、Fetch 和 Axios 優(yōu)缺點及比較

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

[[421376]]

一、ajax、fetch 和 axios 簡介

1.1、ajax

ajax是最早出現(xiàn)發(fā)送后端請求的技術(shù),屬于原生 js 。ajax使用源碼,請點擊《原生 ajax 請求詳解》查看。一般使用之前,我們都需要把它們封裝使用,就以 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.  }     

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

1.2、fetch

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

fetch 使用如下:

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

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

1.3、axios

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

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)缺點

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

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

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

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

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

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

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2018-07-20 15:25:02

2022-02-15 08:51:21

AjaxFetchAxios

2020-02-13 09:52:48

加密前后端https

2016-02-24 16:06:35

Ajax優(yōu)缺點

2017-07-06 14:01:32

CQRSEvent Sourc架構(gòu)

2023-08-10 10:58:24

2012-05-03 09:58:19

VLANVLAN劃分

2019-04-09 10:35:14

API數(shù)據(jù)安全性

2009-12-31 16:42:37

LMDS接入技術(shù)

2019-12-04 07:12:41

前端后端web安全

2014-05-12 09:26:08

2010-08-27 09:45:49

CSS Sprites

2012-07-01 02:10:49

JSP架構(gòu)開發(fā)工具

2017-10-11 18:17:06

大數(shù)據(jù)數(shù)據(jù)可視化前后端

2009-12-31 13:37:46

多協(xié)議GMPLS

2009-08-10 15:09:15

JSP架構(gòu)JSP開發(fā)工具

2017-10-23 13:20:37

2011-03-29 13:09:57

2015-07-17 10:02:15

Linux桌面環(huán)境

2012-07-13 15:29:49

點贊
收藏

51CTO技術(shù)棧公眾號