AJAX和XHR、fetch、axios的關系

AJAX中有兩套原生的API,一個是XHR(XMLHttpRequest),一個是Fetch API

axios是第三方庫,在瀏覽器環境中使用的是XHR

umi-request也是第三方庫,在瀏覽器環境中使用的是Fetch

在 AJAX(Asynchronous JavaScript and XML)中,原生的 API 主要有兩種:XMLHttpRequest(簡稱 XHR)和Fetch API。這兩者都用于在客戶端與服務器之間進行異步通信,但它們有一些關鍵的區別,尤其是在使用方式、功能和靈活性上。以下是兩者的詳細比較和作用。

1.XMLHttpRequest(XHR)

XMLHttpRequest 是最早用于在瀏覽器中執行異步 HTTP 請求的 API,通常用于實現 AJAX 請求。它自 1999 年起就已被引入,長期以來是進行異步請求的標準方法。

主要特點:

- 語法復雜:使用起來相對較復雜,需要更多的配置和回調函數來處理請求的各個階段(如發送請求、接收響應等)。

- 回調函數:它使用回調函數來處理異步響應,需要監聽onreadystatechange 事件,或使用onload、onerror 等事件處理程序來處理響應。

- 支持的請求類型:XMLHttpRequest 支持多種 HTTP 請求方法(如GET、POST、PUT、DELETE 等)。

- 支持同步和異步請求:可以選擇同步(阻塞)或異步(非阻塞)請求,但同步請求會導致瀏覽器凍結,影響用戶體驗,因此通常不推薦使用同步請求。

- 支持跨域請求:通過XMLHttpRequest 進行跨域請求時,需要使用 CORS(跨域資源共享)機制。

const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data", true); // true表示異步請求xhr.onreadystatechange = function () {if (xhr.readyState === XMLHttpRequest.DONE) {if (xhr.status === 200) {console.log("Response:", xhr.responseText); // 處理響應數據} else {console.error("Request failed with status:", xhr.status);}}
};xhr.send(); // 發送請求

優缺點:

- 優點:

- 支持所有主流瀏覽器。

- 可以處理復雜的請求場景。

- 缺點:

- 使用起來較為復雜,需要手動管理事件和回調。

- 不支持 Promise,需要額外處理異步操作。

---

2.Fetch API

Fetch API 是現代瀏覽器中新加入的用于發起網絡請求的 API,相比XMLHttpRequest,Fetch 提供了更簡潔、更強大的語法,并且它基于 Promise,支持更直觀的異步操作。

主要特點:

- 基于 Promise:Fetch API 基于 Promise,這使得異步操作更加簡潔和靈活。可以通過then() 和catch() 方法處理請求結果和錯誤。

- 默認異步:Fetch 請求默認是異步的,因此不會阻塞線程,也沒有必要手動設置異步標志。

- 不支持同步請求:與XMLHttpRequest 不同,Fetch 不支持同步請求,始終是異步的。

- 響應處理:Fetch 返回的響應對象提供了更豐富的方法來處理響應數據,例如可以方便地將響應解析為 JSON、文本、二進制數據等。

- 支持 CORS:Fetch 與XMLHttpRequest 一樣,支持跨域請求,但其跨域配置更加簡潔。

示例代碼:

fetch("https://api.example.com/data").then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json(); // 解析為 JSON}).then(data => {console.log("Response data:", data); // 處理數據}).catch(error => {console.error("There was a problem with the fetch operation:", error);});

優缺點:

- 優點:

- 基于 Promise,代碼更加簡潔、易于理解和維護。

- 更好地支持現代 JavaScript 的異步操作(如 async/await)。

- 對于響應處理(如 JSON 解析)更加方便和靈活。

- 缺點:

- 不支持較舊的瀏覽器(如 IE)。不過可以通過 polyfill 進行兼容。

- 需要手動處理 HTTP 錯誤(fetch 僅在網絡失敗時拋出錯誤,HTTP 錯誤狀態(如 404、500)不會拋出異常)。

---

3. 關鍵區別

特性

XMLHttpRequest

Fetch API

API 風格

基于事件回調和狀態變化

基于 Promise,支持 thencatch 語法

默認異步

支持同步和異步(不推薦使用同步)

始終為異步

響應處理

使用 xhr.responseText,需要手動解析數據

支持直接解析為 JSON、文本、二進制等

支持的功能

需要手動設置跨域(CORS)、狀態檢查等

自動處理跨域,默認遵循 CORS 標準

錯誤處理

需要監聽 onerroronreadystatechange 事件

只會在網絡錯誤時拋出異常,需要手動處理 HTTP 錯誤

支持的瀏覽器

廣泛支持(包括較舊的瀏覽器)

主要支持現代瀏覽器,需要 polyfill 來兼容舊版瀏覽器

同步請求

支持(但不推薦)

不支持同步請求

功能點:

4. 總結

-XMLHttpRequest 是傳統的 API,適合處理兼容性要求較高的項目,但使用起來較為繁瑣,特別是處理回調和異步操作時。

-Fetch API 是現代的、基于 Promise 的 API,提供了更簡潔的語法,易于使用,尤其是與async/await 結合使用時,代碼更加清晰和可維護。不過,它不支持同步請求,并且需要現代瀏覽器支持。

因此,現代 Web 開發中,Fetch API 更為推薦,特別是當你的目標瀏覽器支持它時。如果需要兼容老舊瀏覽器,可能仍然需要使用XMLHttpRequest 或結合使用 polyfill 來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62282.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62282.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openlayers地圖緩存添加

//通過安裝包localforage(npm install localforage)或https://cdnjs.cloudflare.com/ajax/libs/localforage/1.10.0/localforage.min.js tileCacheStore.js import localforage from localforage var tileCacheStorenull;// 從緩存中獲取該瓦片 functio…

云軸科技ZStack出席中國電信國際EMCP平臺香港發布會,持續推動海外合作

近日,以“云聚未來 翼起新篇”為主題的中國電信國際多云服務一站式平臺(E-surfing Managed Cloud Platform,簡稱EMCP平臺)新聞發布會在香港成功舉辦,標志著中國電信國際在云計算服務領域取得了又一重大進展。云軸科技…

面試復盤 part 02·1202-1207 日

作品集講述部分 分析反思 作品集講述部分,視覺講述部分需要更換,需要換成其他視覺相關的修改 具體話術 這是一個信息展示優化方案,用戶為財務,信息區分度不足,理解成本較高,因此選擇需要降低理解成本。…

2024.11.29——[HCTF 2018]WarmUp 1

拿到題&#xff0c;發現是一張圖&#xff0c;查看源代碼發現了被注釋掉的提示 <!-- source.php--> step 1 在url傳參看看這個文件&#xff0c;發現了這道題的源碼 step 2 開始審計代碼&#xff0c;分析關鍵函數 //mb_strpos($haystack,$needle,$offset,$encoding):int|…

brpc的二次封裝以及brpc與etcd的聯合

目的&#xff1a; 搭配etcd的注冊中心管理能知道誰能提供什么服務&#xff0c;并用rpc進行服務調用 封裝思想&#xff1a; 信道管理&#xff0c;將不同服務主機的通信信道管理起來 封裝&#xff1a; 1.指定的信道管理類 一個服務通常會有多個節點&#xff0c;每個節點都會…

【提升效率】如何寫好一份詳細設計文檔

版本日期修訂人描述V1.02024/12/6nick huang創建文檔 背景 CSDN在發起“如何做好一份技術文檔”的活動。 想起我最近在寫一份詳細設計&#xff0c;有一些感受&#xff1a; 一份考慮較周全的“詳細設計文檔模板”能起到質量保底的作用。 當一名初級技術人員需要編寫詳細設計文…

電阻計RM3544、RM3545的使用

目錄&#xff1a; 一、電阻計與PC通訊 1、硬件連接 2、RmLogger.exe的使用 二、RM3545測量35uΩ電阻 一、電阻計與PC通訊 1、硬件連接 可以設置USB或COM口(串口)連接PC&#xff0c;也可以設置為“打印”輸出。 1&#xff09;使用USB連接PC 2&#xff09;使用串口連接PC …

Jenkins 的HTTP Request 插件為什么不能配置Basic認證了

本篇遇到的問題 還是因為Jenkins需要及其所在的OS需要升級&#xff0c;升級策略是在一臺新服務器上安裝和配置最新版本的Jenkins&#xff0c; 當前的最新版本是&#xff1a; 2.479.2 LTS。 如果需要這個版本的話可以在官方站點下載&#xff0c;也可以到如下地址下載&#xff1…

uniapp 封裝自定義頭部導航欄

封裝原因 項目中有時候需要使用自定義的頭部導航欄&#xff0c;原生的無法滿足需求 參數 屬性名描述示例title標題字符串&#xff1a;首頁bgColor背景色字符串&#xff1a;#ffftype左側的操作內容字符串&#xff1a;all&#xff0c;詳細值請在下方查看 參數解釋 type all…

docker學習筆記(五)--docker-compose

文章目錄 常用命令docker-compose是什么yml配置指令詳解versionservicesimagebuildcommandportsvolumesdepends_on docker-compose.yml文件編寫 常用命令 命令說明docker-compose up啟動所有docker-compose服務&#xff0c;通常加上-d選項&#xff0c;讓其運行在后臺docker-co…

Linux中inode

磁盤的空間管理 如何對磁盤空間進行管理&#xff1f; 假設在一塊大小為500G的磁盤中&#xff0c;500*1024*1024524288000KB。在磁盤中&#xff0c;扇區是磁盤的基本單位&#xff08;一般大小為512byte&#xff09;&#xff0c;而文件系統訪問磁盤的基本單位是4KB&#xff0c;因…

5G揚帆乘勁風,遨游通訊賦能千行百業譜新篇

在大型工廠&#xff0c;輕觸手機屏幕&#xff0c;實時庫存數據、人員定位等信息便躍然眼前、一目了然&#xff1b;在邊遠油田&#xff0c;動動手指&#xff0c;即可實時查詢設備溫度、危險氣體濃度等信息&#xff0c;大數據瞬間盡在“掌”握……在遨游5G防爆智能手機的助力下&a…

RT Thread Studio新建STM32F407IG工程文件編譯提示錯誤

編譯提示錯誤 原因: RT 源碼使用4.0.3的話&#xff0c;請用STM32F4支持包的0.2.2版本&#xff0c;就不會出錯了。 如果支持包用0.2.3版本的話&#xff0c;需要用RT內核4.1.0版本。0.2.3 版本更新了一些針對內核4.1.0的驅動代碼&#xff0c;這幾個定義都是4.1.0里的。

學生管理系統(java)

1.前期準備 &#xff08;1&#xff09;新建java項目 &#xff08;2&#xff09;新建java軟件包以及三個文件Student.java,Student.txt,StuSystem.java Student.java package student_management_system;public class Student {private String id;private String name;private…

JavaWeb學習(2)(Cookie原理(超詳細)、HTTP無狀態)

目錄 一、HTTP無狀態。 &#xff08;1&#xff09;"記住我"&#xff1f; &#xff08;2&#xff09;HTTP無狀態。 &#xff08;3&#xff09;信息存儲客戶端中。如何處理&#xff1f; 1、loaclStorage與sessionStorage。 2、Cookie。 二、Cookie。 &#xff08;1&…

SpringBoot教程(三十二) SpringBoot集成Skywalking鏈路跟蹤

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking鏈路跟蹤 一、Skywalking是什么&#xff1f;二、Skywalking與JDK版本的對應關系三、Skywalking下載四、Skywalking 數據存儲五、Skywalking 的啟動六、部署探針 前提&#xff1a; Agents 8.9.0 放入 …

flask創建templates目錄存放html文件

首先&#xff0c;創建flask項目&#xff0c;在pycharm中File --> New Project&#xff0c;選擇Flask項目。 然后&#xff0c;在某一目錄下&#xff0c;新建名為templates的文件夾&#xff0c;這時會是一個普通的文件夾。 然后右擊templates文件夾&#xff0c;選擇Unmark as …

Java進階(注解,設計模式,對象克隆)

Java進階(注解&#xff0c;設計模式&#xff0c;對象克隆) 一. 注解 1.1 什么是注解 java中注解(Annotation)&#xff0c;又稱java標注&#xff0c;是一種特殊的注釋 可以添加在包&#xff0c;類&#xff0c;成員變量&#xff0c;方法&#xff0c;參數等內容上 注解會隨同…

部署loki,grafana 以及springcloud用法舉例

文章目錄 場景docker 部署grafanadocker-compose部署loki維護配置文件 local-config.yaml維護docker-compose.yml配置啟動 grafana 添加loki數據源springcloud用法舉例查看loki的explore,查看日志 場景 小公司缺少運維崗位&#xff0c;需要研發自己部署日志系統&#xff0c;elk…

keil報錯---connection refused due to device mismatch

解決辦法如下&#xff1a; 記得改成1 把Enable取消