日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

一文掌握ajax、fetch和axios的區(qū)別對比

瀏覽:306日期:2022-06-12 09:22:03
目錄
  • AJAX、Fetch、axios
    • AJAX
    • 創(chuàng)建AJAX
    • AJAX的缺點:
    • axios原理
    • axios的特點
    • axios常用的方法
    • put和patch的區(qū)別
    • axios相關配置
    • axios攔截器執(zhí)行順序問題
    • 為什么axios中需要攔截器
    • 為什么請求攔截2會在請求攔截1之前執(zhí)行呢?
  • Fetch、ajax與axios的區(qū)別
    • Fetch和Ajax比有什么優(yōu)點
      • 總結
        • axios源碼分析
        • axios的執(zhí)行流程

      AJAX、Fetch、axios

      AJAX

      AJAX可以在不更新全局的情況下更新局部頁面。通過在與服務器進行數據交換,可以使網頁實現異步更新。

      AJAX的原理就是通過XHR對象來向服務器發(fā)起異步請求,從服務器獲得數據,然后用JS來操作DOM更新頁面。領導想找小李匯報一下工作,就委托秘書去叫小李,自己就接著做其他事情,直到秘書告訴他小李已經到了,最后小李跟領導匯報工作。Ajax請求數據流程與“領導想找小李匯報一下工作”類似,上述秘書就相當于XMLHttpRequest對象,領導相當于瀏覽器,響應數據相當于小李。瀏覽器可以發(fā)送HTTP請求后,接著做其他事情,等收到XHR返回來的數據再進行操作。

      創(chuàng)建AJAX

      // 1. 創(chuàng)建 XMLHttpRequest 實例let xhr = XMLHttpRequest()// 2. 打開和服務器的連接xhr.open("get", "URL")// 3.發(fā)送xhr.send()// 4. 接收變化。xhr.onreadystatechange = () => {    if(xhr.readyState == 4 && xhr.status == 200){   // readyState: ajax 狀態(tài),status:http 請求狀態(tài)console.log(xhr.responseText);   //響應主體    }}
      • 創(chuàng)建AJAX實例:let xhr = new XMLHttpRequest()
      • 打開請求,配置請求前的配置項:xhr.open([http method], [url], [async], [userName], [userPass])
      1. http methods 請求方式:post,get,delete,put,head,options,trace,connect
      2. url:想服務器請求的路徑
      3. async:是否為異步請求
      4. userName、userPass:用戶名與密碼
      • 通過XMLHttpRequest.open()方法與服務器建立連接
      • 發(fā)送請求:XMLHttpRequest.send() 方法中如果 Ajax 請求是異步的則這個方法發(fā)送請求后就會返回,如果Ajax請求是同步的,那么請求必須知道響應后才會返回。
      • 通過XMLHttpRequest對象的onreadystatechange事件監(jiān)聽服務器端的通信狀態(tài)
      • 接收數據并進行處理
      • 將處理后的結果更新到頁面上

      AJAX的缺點:

      • 本是針對MVC架構,不符合前端MVVM的浪潮
      • 基于原生的XHR開發(fā)
      • 配置和調用方式混亂

      axios原理

      axios是使用promise封裝的ajax,它內部有兩個攔截器,分別是request攔截器和response攔截器。

      • 請求攔截器的作用是在請求發(fā)送之前進行一些操作,例如在每個請求體上加入token
      • 響應攔截器的作用是接收到響應后做的一些操作,例如登錄失效后需要重新登錄跳轉到登錄頁

      axios的特點

      • 由瀏覽器端發(fā)起請求,在瀏覽器中創(chuàng)建XHR
      • 支持promise API
      • 監(jiān)聽請求和返回
      • 更好的格式化,自動將數據轉換為json數據
      • 安全性更高,可抵御CSRF攻擊

      axios常用的方法

      axios常用的方法有getpostput、patch、delete等。其中getpost返回的都是promise對象,可以使用promise方法

      axios.get(url[, config]):get請求用于列表和信息查詢

      axios.get("apiURL", {    param: {id: 1    }    // param 中的的鍵值對最終會 ? 的形式,拼接到請求的鏈接上,發(fā)送到服務器。}).then(res => {    console.log(res);}).catch( error => {    console.log(error)}

      axios.delete(url[, config]):刪除

      axios.delete("apiURL", {    params: {id: 1    },    timeout: 1000})

      axios.post(url[, data[, config]]):post請求用于信息的添加

      axios.post("apiURL",{user: "小新",age: 18}).then( res => {    console.log(res);}).catch( error => {    console.log(error)}

      axios.put(url[, data[, config]]):更新操作

      axios.put("apiURL", {    name: "小新",})

      axios.patch(url[, data[, config]]):更新操作

      axios.patch("apiURL", {    id: 13,},{   timeout: 1000,})

      put和patch的區(qū)別

      patch方法用來更新局部資源,假設我們有一個UserInfo,里面有userId,userName,userGender等10個字段。可你的編輯功能因為需求,在某個特別的頁面里只能修改userName,這個時候就可以使用patch。

      put也適用于更新數據,但必須提供完整的資源對象。

      axios相關配置

      • url:用于請求服務器的url
      • method:請求方法,默認為get
      • baseURL:會自動加到url前面
      • proxy:用于配置代理
      • transformRequest:允許在服務器發(fā)送請求之前修改請求數據

      axios攔截器執(zhí)行順序問題

      • 請求攔截:axios的請求攔截器會先執(zhí)行最后指定的回調函數,再依次向前執(zhí)行
      • 響應攔截:axios的響應攔截器會先執(zhí)行最先執(zhí)行的回調函數,再依次向前執(zhí)行

      例如:

      axios.interceptors.request.use(config => {  console.log(`請求攔截1`);  return config;});axios.interceptors.request.use(config => {  // 在發(fā)送請求之前做些什么   console.log(`請求攔截2`);  return config;});// 添加響應攔截器 axios.interceptors.response.use(response => {  // 對響應數據做點什么   console.log(`成功的響應攔截1`);  return response.data;});// 添加響應攔截器 axios.interceptors.response.use(response => {  // 對響應數據做點什么   console.log(`成功的響應攔截2`);  return response;});// 發(fā)送請求 axios.get("/posts")  .then(response => {    console.log("成功了");  }) 

      執(zhí)行結果為

      console.log("請求攔截2");
      console.log("請求攔截1");
      console.log("成功的響應攔截1");
      console.log("成功的響應攔截2");
      console.log("成功了");

      為什么axios中需要攔截器

      在SPA應用中,通常會使用token進行用戶身份認證,這就要求每次請求必須攜帶用戶的身份信息,針對這個需求,為了避免在每個請求中單獨處理,我們可以通過封裝統(tǒng)一的request函數來為每隔請求統(tǒng)一添加token信息。

      但如果想為某些請求添加緩存時間或者控制某些請求的調用頻率的話,我們就需要不斷地修改request函數來擴展對應的功能。此時,如果在考慮對響應進行統(tǒng)一處理,我們的request函數將變得越來越龐大,也越來越難維護。所以axios為我們提供了攔截器。

      為什么請求攔截2會在請求攔截1之前執(zhí)行呢?

      axios源碼中將發(fā)送請求分為了請求攔截器、發(fā)送請求、響應攔截器、相應回調,通過Promise的鏈式調用將這些部分結合起來了,這樣就得到了發(fā)送請求拿到數據的全部過程。

      下面分析源碼:

      • 代碼開始構建了一個config配置對象,用于第一次執(zhí)行Promise返回一個成功的Promise
      • 最核心的數組chain,這個數組中保存了請求攔截器、響應攔截器和發(fā)送請求函數。該數組中間放的是發(fā)送請求的函數,左邊放的是請求攔截器,右邊放的是響應攔截器。在第一步中返回的Promise對象,將遍歷chain數組逐一執(zhí)行里面的函數,并返回新的Promise對象
      • 往數組中添加請求攔截函數,依照axios請求的執(zhí)行順序,請求攔截器應該在發(fā)送請求之前執(zhí)行,故應該添加在發(fā)送請求函數的前面,使用unshift方法
      • 往數組中添加響應攔截器函數,依照axios請求的執(zhí)行順序,響應攔截器應該在發(fā)送請求之后執(zhí)行,故應該添加在發(fā)送請求函數的后面,所以使用的是數組的push方法
      • Promise遍歷執(zhí)行,每次從chain中取出兩個 函數執(zhí)行(一個成功回調,一個失敗回調)
      • 最后返回一個Promise對象,用于執(zhí)行響應數據的回調

      fetch
      fetch是http請求數據的方式,它使用Promise,但不使用回調函數。fetch采用模塊化設計,通過數據流處理數據,對于請求大文件或網速慢的情況相當有用。默認情況下fetch不會接收或發(fā)送cookies。

      優(yōu)點:

      • 采用模塊化思想,將輸入、輸出、狀態(tài)跟蹤分離
      • 基于promise,返回一個promise對象

      缺點:

      • 過于底層,有很多狀態(tài)碼沒有進行封裝
      • 無法阻斷請求
      • 兼容性差無法檢測請求進度

      Fetch、ajax與axios的區(qū)別

      • 傳統(tǒng)的ajax利用的是HMLHttpRequest這個對象,和后端進行交互。
      • JQury ajax是對原生XHR的封裝,多請求間有嵌套的話就會出現回調地獄的問題。
      • axios使用promise封裝XHR,解決了回調地獄的問題。而Fetch沒有使用XHR,使用的是promise

      Fetch和Ajax比有什么優(yōu)點

      Fetch使用的是promise,方便使用異步,沒有回調地獄的問題。

      總結

      Ajax是一種web數據交互的方式,它可以使頁面在不重新加載的情況下請求數據并進行局部更新,它內部使用了XHR來進行異步請求。Ajax在使用XHR發(fā)起異步請求時得到的是XML格式的數據,如果想要JSON格式,需要進行額外的轉換;Ajax本身針對的是MVC框架,不符合現在的MVVM架構;Ajax有回調地獄問題;Ajax的配置復雜

      Fetch是XHR的代替品,它基于Promise實現的,并且不使用回調函數,它采用模塊化結構設計,并使用數據流進行傳輸,對于大文件和網速慢的情況非常友好。但是Fetch不會對請求和響應進行監(jiān)聽;不能阻斷請求;過于底層,對一些狀態(tài)碼沒有封裝;兼容性差。

      axios是基于PromiseXHR進行封裝,它內部封裝了兩個攔截器,分別是請求攔截器和響應攔截器。請求攔截器用于在請求發(fā)出之前進行一些操作,比如:設置請求體,攜帶Cookie、token等;響應攔截器用于在得到響應后進行一些操作,比如:登錄失效后跳轉到登錄頁面重新登錄。axios有get、post、put、patch、delete等方法。axios可以對請求和響應進行監(jiān)聽;返回Promise對象,可以使用Promise的API;返回JSON格式的數據;由瀏覽器發(fā)起請求;安全性更高,可以抵御CSRF攻擊。

      axios源碼分析

      axios的執(zhí)行流程

      • 使用axios.create創(chuàng)建單獨的實例,或直接使用axios實例
      • 對于axios調用進入到request()中進行處理
      • 執(zhí)行請求攔截器
      • 請求數據轉換器,將傳入的數據進行處理,比如JSON.stringify(data)
      • 執(zhí)行適配器,判斷是瀏覽器端還是node端,以執(zhí)行不同的方法
      • 響應數據轉換器,對服務器端的數據進行處理,比如JSON.parse(data)
      • 執(zhí)行響應攔截器,對服務器端數據進行處理,比如token失效跳轉到登錄頁
      • 返回數據

      入口文件(lib/axios.js)

      導出的axios就是 實例化后的對象,還在其上掛載create方法,以供創(chuàng)建獨立的實例,實現實例之間互不影響。

      // 創(chuàng)建實例過程的方法function createInstance(defaultConfig) {  return instance;}// 實例化var axios = createInstance(defaults); // 創(chuàng)建獨立的實例,隔離作用域axios.create = function create(instanceConfig) {  return createInstance(mergeConfig(axios.defaults, instanceConfig));};// 導出實例module.exports = axios;

      createInstance()

      function createInstance(defaultConfig) {  // 實例化,創(chuàng)建一個上下文  var context = new Axios(defaultConfig);   // 平時調用的 get/post 等等請求,底層都是調用 request 方法  // 將 request 方法的 this 指向 context(上下文),形成新的實例  var instance = bind(Axios.prototype.request, context);   // Axios.prototype 上的方法 (get/post...)掛載到新的實例 instance 上,  // 并且將原型方法中 this 指向 context  utils.extend(instance, Axios.prototype, context);   // Axios 屬性值掛載到新的實例 instance 上  // 開發(fā)中才能使用 axios.default/interceptors  utils.extend(instance, context);   return instance;}

      createInstance執(zhí)行流程:

      • 通過構造函數Axios創(chuàng)建實例context,作為下面request方法的上下文(this指向)
      • Axios.prototype.request方法作為實例使用,并把this指向context,形成新的實例instance
      • 將構造函數Axios.prototype上的方法掛載到新的實例instance上,然后將原型各個方法中的this指向context,這樣才能使用get、post等方法
      • Axios的屬性掛載到instance

      可以看到axios不是簡單的創(chuàng)建實例context,而是在context上進行this綁定形成新的實例,然后將Axios屬性和請求方法掛載到新的實例上

      攔截器(lib/core/InterceptorManager.js)

      攔截器涉及一個屬性和三個方法:

      • handler:存放use注冊的回調函數
      • use:注冊成功和失敗的回調函數
      • eject:刪除注冊過的函數
      • forEach:遍歷回調函數
      function InterceptorManager() {  // 存放 use 注冊的回調函數  this.handlers = [];}InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {  // 注冊成功和失敗的回調函數  this.handlers.push({    fulfilled: fulfilled,    rejected: rejected,    ...  });  return this.handlers.length - 1;};InterceptorManager.prototype.eject = function eject(id) {  // 刪除注冊過的函數  if (this.handlers[id]) {    this.handlers[id] = null;  }};InterceptorManager.prototype.forEach = function forEach(fn) {  // 遍歷回調函數,一般內部使用多  utils.forEach(this.handlers, function forEachHandler(h) {    if (h !== null) {      fn(h);    }  });};

      dispatchRequest(lib/core/dispatchRequest.js)

      dispatchRequest主要做了以下操作:

      • transformRequest: 對 config 中的 data 進行加工,比如對 post 請求的 data 進行字符串化(JSON.stringify(data))
      • adapter:適配器,包含瀏覽器端 xhr 和 node 端的 http
      • transformResponse: 對服務端響應的數據進行加工,比如 JSON.parse(data)

      取消請求(lib/cancel/CancelToken.js)

      var CancelToken = axios.CancelToken;var source = CancelToken.source();axios.get("/user/12345", {  cancelToken: source.token}).catch(function(thrown) {  if (axios.isCancel(thrown)) {    console.log("Request canceled", thrown.message);  } else {    // 處理錯誤  }});// 取消請求(message 參數是可選的)source.cancel("Operation canceled by the user.");
      • CancelToken 掛載 source 方法用于創(chuàng)建自身實例,并且返回 {token, cancel}
      • token 是構造函數 CancelToken 的實例,cancel 方法接收構造函數 CancelToken 內部的一個 cancel 函數,用于取消請求
      • 創(chuàng)建實例中,有一步是創(chuàng)建處于 pengding 狀態(tài)的 promise,并掛在實例方法上,外部通過參數 cancelToken 將實例傳遞進 axios 內部,內部調用 cancelToken.promise.then 等待狀態(tài)改變
      • 當外部調用方法 cancel 取消請求,pendding 狀態(tài)就變?yōu)?resolve,即取消請求并且拋出 reject(message)

      總結

      • 為了支持 axios() 簡潔寫法,內部使用 request 函數作為新實例
      • 使用 promsie 鏈式調用的巧妙方法,解決順序調用問題
      • 數據轉換器方法使用數組存放,支持數據的多次傳輸與加工
      • 適配器通過兼容瀏覽器端和 node 端,對外提供統(tǒng)一 api
      • 取消請求這塊,通過外部保留 pendding 狀態(tài),控制 promise 的執(zhí)行時機

      到此這篇關于一文掌握ajax、fetch和axios的區(qū)別對比的文章就介紹到這了,更多相關ajax、fetch和axios的比較內容請搜索以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持!

      標簽: Ajax
      日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
      激情综合网址| 亚洲综合日韩| 红桃视频亚洲| 久久久夜精品| 免费毛片在线不卡| 亚洲女同中文字幕| 日本 国产 欧美色综合| 免费观看在线综合色| 亚洲一二三区视频| 国产精品地址| а√在线中文在线新版| 婷婷综合社区| 青青伊人久久| 欧美亚洲日本精品| 2023国产精品久久久精品双| 久久国产高清| 国产精品久久亚洲不卡| 国产欧美日韩在线一区二区| а√天堂8资源在线| 亚洲美洲欧洲综合国产一区 | 91精品国产调教在线观看| 亚洲精品91| 一区二区亚洲视频| 国产欧美一区二区三区精品观看| 另类综合日韩欧美亚洲| 亚洲福利久久| 国产精品嫩模av在线| 97人人精品| 日韩激情视频网站| 国产夫妻在线| 青青草91久久久久久久久| 色一区二区三区四区| 免费看黄色91| 国产精品99免费看| 成人一区不卡| 国产精品115| 亚洲精品高潮| 久久精品高清| 高清av不卡| 国产精品久久乐| 国产精品a级| 久久av国产紧身裤| 亚洲黄色影院| 91精品蜜臀一区二区三区在线| 久久精品色播| 亚洲精品国产偷自在线观看| 一区二区三区网站| 国产精品伦理久久久久久| 久久婷婷一区| 日本不卡免费高清视频在线| 国产精品毛片在线| 国产欧美日韩精品高清二区综合区 | 青青伊人久久| 欧美午夜不卡| 久久99国产精品视频| 久热精品在线| 免费污视频在线一区| 免费久久99精品国产| 欧美三级网址| 鲁鲁在线中文| 91一区二区三区四区| 国产一区二区三区探花| 日韩中出av| 一区二区三区国产在线| 国产99精品一区| 精品中文字幕一区二区三区四区| 国产精品一区二区美女视频免费看| 伊人精品久久| 鲁大师成人一区二区三区| 蜜桃成人av| 日韩视频一区二区三区在线播放免费观看| 久久不见久久见中文字幕免费| 亚洲欧美一区在线| 国产盗摄——sm在线视频| 国产一区清纯| 亚洲一区激情| 婷婷亚洲综合| 日韩欧美四区| 日本欧美国产| 成人黄色av| 天堂√8在线中文| 亚洲第一精品影视| 日韩精品第一| 国产精品久久久久久久久久妞妞 | 亚洲精品看片| 午夜亚洲福利| 电影91久久久| 久久久久久久久丰满| 视频一区在线播放| 国产欧美成人| 日韩av福利| 在线亚洲一区| 欧美精品91| 欧美日韩国产在线观看网站| 综合亚洲视频| 国产亚洲一区二区手机在线观看 | 日韩欧美激情电影| 成人日韩在线观看| 日韩精品中文字幕一区二区| 欧美xxxx中国| 久久国产免费看| 亚洲深爱激情| 国产精品一区二区三区美女 | 国产精品一区免费在线| 久久中文亚洲字幕| 欧美日韩亚洲一区三区| 影视先锋久久| 国产精品久久免费视频| 亚洲国产一区二区在线观看 | 国产另类在线| 视频一区二区不卡| 久久精品主播| 国产成人精品一区二区三区视频| 日韩欧美在线精品| 国产精品日韩欧美一区| 欧美成人一二区| 免费不卡在线观看| 美女视频免费精品| 日韩av中文字幕一区| 欧美.日韩.国产.一区.二区| 日韩精品高清不卡| 中文字幕av一区二区三区四区| 久久精品国产福利| 日韩精品一区二区三区中文| 激情综合在线| 精精国产xxxx视频在线野外| 国产精品极品国产中出| 水蜜桃久久夜色精品一区的特点| 久久91导航| 高潮一区二区| 日韩精品免费一区二区在线观看| 97国产精品| 国产精品xxx在线观看| 热久久国产精品| 国产日韩免费| 国产精品久久久久久av公交车| 国产精品男女| 99成人在线| 日本免费新一区视频| 四虎884aa成人精品最新| 福利视频一区| 国产盗摄——sm在线视频| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产亚洲精aa在线看| 亚洲精一区二区三区| 四虎在线精品| 亚洲a成人v| 欧美日一区二区在线观看| 日韩av不卡一区二区| 日韩精品a在线观看91| 日韩精品视频中文字幕| 国产极品一区| 免费视频亚洲| 久久成人亚洲| 国产一区丝袜| 欧美午夜精品一区二区三区电影| 99精品在线观看| 中文精品在线| 日韩一区二区三区高清在线观看 | 99视频在线精品国自产拍免费观看| 久久国产88| 国产精品久久久久久久久免费高清 | 国产aa精品| 久久亚洲二区| 久久一区二区三区电影| 免费视频久久| 麻豆精品av| 国产精品久久乐| 国产精品毛片久久久| 欧美日韩夜夜| 国产99久久| 综合干狼人综合首页| 欧美精品观看| 蜜桃成人精品| 麻豆传媒一区二区三区| 99在线|亚洲一区二区| 免费在线视频一区| 日产欧产美韩系列久久99| 亚洲免费福利一区| 亚洲精一区二区三区| 亚洲图片久久| 日韩精品一区二区三区中文在线 | 国产一区二区三区成人欧美日韩在线观看| 青草av.久久免费一区| 青草综合视频| 国产中文字幕一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲精品在线国产| 中文字幕成人| 开心激情综合| 秋霞国产精品| 99riav国产精品| 午夜久久99| 久久青草久久| 美女久久网站| 欧美国产专区| 美女久久一区| 成人精品高清在线视频| 99久久精品费精品国产| 99在线精品免费视频九九视|