<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
AJAX可以在不更新全域性的情況下更新區域性頁面。通過在與伺服器進行資料交換,可以使網頁實現非同步更新。
AJAX的原理就是通過XHR物件來向伺服器發起非同步請求,從伺服器獲得資料,然後用JS來操作DOM更新頁面。領導想找小李彙報一下工作,就委託祕書去叫小李,自己就接著做其他事情,直到祕書告訴他小李已經到了,最後小李跟領導彙報工作。Ajax請求資料流程與“領導想找小李彙報一下工作”類似,上述祕書就相當於XMLHttpRequest物件,領導相當於瀏覽器,響應資料相當於小李。瀏覽器可以傳送HTTP請求後,接著做其他事情,等收到XHR返回來的資料再進行操作。
// 1. 建立 XMLHttpRequest 範例 let xhr = XMLHttpRequest() // 2. 開啟和伺服器的連線 xhr.open('get', 'URL') // 3.傳送 xhr.send() // 4. 接收變化。 xhr.onreadystatechange = () => { if(xhr.readyState == 4 && xhr.status == 200){ // readyState: ajax 狀態,status:http 請求狀態 console.log(xhr.responseText); //響應主體 } }
axios是使用promise封裝的ajax,它內部有兩個攔截器,分別是request攔截器和response攔截器。
axios常用的方法有get
、post
、put
、patch
、delete
等。其中get
和post
返回的都是promise
物件,可以使用promise
方法
axios.get(url[, config])
:get請求用於列表和資訊查詢
axios.get('apiURL', { param: { id: 1 } // param 中的的鍵值對最終會 ? 的形式,拼接到請求的連結上,傳送到伺服器。 }).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, })
patch
方法用來更新區域性資源,假設我們有一個UserInfo,裡面有userId,userName,userGender等10個欄位。可你的編輯功能因為需求,在某個特別的頁面裡只能修改userName,這個時候就可以使用patch
。
put
也適用於更新資料,但必須提供完整的資源物件。
例如:
axios.interceptors.request.use(config => { console.log(`請求攔截1`); return config; }); axios.interceptors.request.use(config => { // 在傳送請求之前做些什麼 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; }); // 傳送請求 axios.get('/posts') .then(response => { console.log('成功了'); })
執行結果為
console.log("請求攔截2");
console.log("請求攔截1");
console.log("成功的響應攔截1");
console.log("成功的響應攔截2");
console.log("成功了");
在SPA應用中,通常會使用token進行使用者身份認證,這就要求每次請求必須攜帶使用者的身份資訊,針對這個需求,為了避免在每個請求中單獨處理,我們可以通過封裝統一的request函數來為每隔請求統一新增token資訊。
但如果想為某些請求新增快取時間或者控制某些請求的呼叫頻率的話,我們就需要不斷地修改request函數來擴充套件對應的功能。此時,如果在考慮對響應進行統一處理,我們的request函數將變得越來越龐大,也越來越難維護。所以axios為我們提供了攔截器。
在axios
原始碼中將傳送請求分為了請求攔截器、傳送請求、響應攔截器、相應回撥,通過Promise的鏈式呼叫將這些部分結合起來了,這樣就得到了傳送請求拿到資料的全部過程。
下面分析原始碼:
fetchfetch
是http請求資料的方式,它使用Promise,但不使用回撥函數。fetch
採用模組化設計,通過資料流處理資料,對於請求大檔案或網速慢的情況相當有用。預設情況下fetch不會接收或傳送cookies。
優點:
缺點:
HMLHttpRequest這個物件
,和後端進行互動。JQury ajax
是對原生XHR
的封裝,多請求間有巢狀的話就會出現回撥地獄的問題。axios
使用promise
封裝XHR
,解決了回撥地獄的問題。而Fetch
沒有使用XHR
,使用的是promise
Fetch
使用的是promise
,方便使用非同步,沒有回撥地獄的問題。
Ajax
是一種web資料互動的方式,它可以使頁面在不重新載入的情況下請求資料並進行區域性更新,它內部使用了XHR
來進行非同步請求。Ajax
在使用XHR
發起非同步請求時得到的是XML
格式的資料,如果想要JSON格式,需要進行額外的轉換;Ajax
本身針對的是MVC框架
,不符合現在的MVVM架構
;Ajax
有回撥地獄問題;Ajax
的設定複雜
而Fetch
是XHR的代替品,它基於Promise
實現的,並且不使用回撥函數,它採用模組化結構設計,並使用資料流進行傳輸,對於大檔案和網速慢的情況非常友好。但是Fetch
不會對請求和響應進行監聽;不能阻斷請求;過於底層,對一些狀態碼沒有封裝;相容性差。
axios
是基於Promise
對XHR
進行封裝,它內部封裝了兩個攔截器,分別是請求攔截器和響應攔截器。請求攔截器用於在請求發出之前進行一些操作,比如:設定請求體,攜帶Cookie、token等;響應攔截器用於在得到響應後進行一些操作,比如:登入失效後跳轉到登入頁面重新登入。axios
有get、post、put、patch、delete等方法。axios可以對請求和響應進行監聽;返回Promise
物件,可以使用Promise
的API;返回JSON
格式的資料;由瀏覽器發起請求;安全性更高,可以抵禦CSRF攻擊。
JSON.stringify(data)
JSON.parse(data)
入口檔案(lib/axios.js)
匯出的axios就是 範例化後的物件,還在其上掛載create
方法,以供建立獨立的範例,實現範例之間互不影響。
// 建立範例過程的方法 function createInstance(defaultConfig) { return instance; } // 範例化 var axios = createInstance(defaults); // 建立獨立的範例,隔離作用域 axios.create = function create(instanceConfig) { return createInstance(mergeConfig(axios.defaults, instanceConfig)); }; // 匯出範例 module.exports = axios;
createInstance()
function createInstance(defaultConfig) { // 範例化,建立一個上下文 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 上 // 開發中才能使用 axios.default/interceptors utils.extend(instance, context); return instance; }
createInstance
執行流程:
Axios
建立範例context
,作為下面request
方法的上下文(this指向)Axios.prototype.request
方法作為範例使用,並把this
指向context
,形成新的範例instance
Axios.prototype
上的方法掛載到新的範例instance
上,然後將原型各個方法中的this
指向context
,這樣才能使用get、post
等方法Axios
的屬性掛載到instance
上可以看到axios不是簡單的建立範例context,而是在context上進行this繫結形成新的範例,然後將Axios屬性和請求方法掛載到新的範例上
攔截器(lib/core/InterceptorManager.js)
攔截器涉及一個屬性和三個方法:
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主要做了以下操作:
取消請求(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.');
總結
到此這篇關於一文掌握ajax、fetch和axios的區別對比的文章就介紹到這了,更多相關ajax、fetch和axios的比較內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45