Ajax 之戰:XMLHttpRequest與Fetch API比較
Ajax 是大多數 Web 應用程式背後的核心技術。它允許頁面向 Web 服務發出進一步的請求,因此無需頁面重新整理往返伺服器即可呈現資料。
Ajax一詞不是一種技術。相反,它指的是可以從客戶端指令碼載入伺服器資料的技術。多年來已經引入了幾種選擇。仍然有兩種主要方法,大多數 JavaScript 框架將使用一種或兩種方法。
XMLHttpRequest
XMLHttpRequest1999 年首次作為非標準 Internet Explorer 5.0 ActiveX 元件出現。微軟開發它是為了支援他們基於瀏覽器的 Outlook 版本。XML 是當時最流行(或被炒作)的資料格式,但XMLHttpRequest支援文字和尚未發明的 JSON。
XMLHttpRequest受到所有主流瀏覽器的支援,並於 2006 年成為官方 Web 標準。
const xhr = new XMLHttpRequest(); xhr.open("GET", "/service"); // state change event xhr.onreadystatechange = () => { // is request complete? if (xhr.readyState !== 4) return; if (xhr.status === 200) { // request successful console.log(JSON.parse(xhr.responseText)); } else { // request not successful console.log("HTTP error", xhr.status, xhr.statusText); } }; // start request xhr.send(); |
在請求的整個生命週期中,onreadystatechange回撥函式會執行數次。XMLHttpRequest物件的readyState屬性返回當前狀態。
- 0 (uninitialized) - 請求未被初始化
- 1 (載入中) - 伺服器連線建立
- 2 (載入中) - 收到請求
- 3 (互動式) - 處理請求
- 4 (complete) - 請求完成,響應已準備好
在達到狀態4之前,函式幾乎無法做什麼事情。
Fetch
Fetch是一個現代的基於Promise的Ajax請求API,首次出現在2015年,並被大多數瀏覽器所支援。它不是建立在XMLHttpRequest的基礎上,並以更簡潔的語法提供更好的一致性。下面的Promise鏈與上面的XMLHttpRequest例子功能相同。
fetch("/service", { method: "GET" }) .then((res) => res.json()) .then((json) => console.log(json)) .catch((err) => console.error("error:", err)); |
或者使用 async / await::
try { const res = await fetch("/service", { method: "GET" }), json = await res.json(); console.log(json); } catch (err) { console.error("error:", err); } |
第一輪:Fetch獲勝
除了更乾淨、更簡潔的語法外,FetchAPI 還提供了一些優於老化的XMLHttpRequest:
- 標頭、請求和響應物件
- 快取控制
- CORS 控制
- 憑證控制
- 重定向控制
- 資料流
- 伺服器端支援
第 2 輪:XMLHttpRequest獲勝
XMLHttpRequest但仍有一些技巧可以超越Fetch():
- 進度支援
- 超時支援
- 中止支援
- 更明顯的故障檢測
- 瀏覽器支援
相關文章
- XMLHttpRequest和fetch比較XMLHTTP
- 非同步請求xhr、ajax、axios與fetch的區別比較非同步iOS
- 來了解一下Ajax是什麼?Ajax的原理?Ajax與傳統Web比較?Ajax的優缺點?Ajax的Post與Get比較Web
- Fetch 代替 Ajax 的瀏覽器 API瀏覽器API
- AJAX 建立 XMLHttpRequest物件XMLHTTP物件
- ajax建立XMLHttpRequest物件XMLHTTP物件
- AJAX、$.ajax、axios、fetch、superagentiOS
- AJAX API三駕馬車: Axios vs . jQuery和FetchAPIiOSjQuery
- ajax,axios,fetchiOS
- 原生ajax的XMLHttpRequest物件的建立XMLHTTP物件
- 【IOS】java 與oc之間的比較iOSJava
- API閘道器:Apache APISIX 3.0與Kong 3.0比較APIApache
- 前端知識總結之Ajax,axios,fetch篇前端iOS
- 原生Js呼叫Fetch Api請求介面(新的Ajax解決方案)JSAPI
- Ajax、fetch、axios的區別與優缺點iOS
- Fetch API 教程API
- 從ajax到fetch、axiosiOS
- 用js內建物件XMLHttpRequest 來用ajaxJS物件XMLHTTP
- [java之list比較]Java
- Vue與React比較VueReact
- 【Redis與Memcached比較】Redis
- RecyclerView與ListView比較View
- js與jq比較JS
- PostgreSQL與MySQL比較MySql
- Ruby程式語言與Ruby之間的比較
- ajax、axios、fetch、jsonp、corsiOSJSONCORS
- java Ajax ext之API文件詳解JavaAPI
- Ajax 跨域請求 Access to XMLHttpRequest 解決方案跨域XMLHTTP
- 第108天:Ajax中XMLHttpRequest詳解XMLHTTP
- axios,Ajax,jQuery ajax,axios和fetch的區別iOSjQuery
- React與Vue模板使用比較(一、vue模板與React JSX比較)ReactVueJS
- java容器之List+Comparable與Comparator比較Java
- Flutter 與 iOS 功能比較FlutteriOS
- Flutter與Swift比較 - evroneFlutterSwiftVR
- Hibernate與mybatis比較MyBatis
- Python 與 Javascript 比較PythonJavaScript
- 利用fetch方法實現Ajax請求
- 對ajax、axios、fetch的認識iOS