摘要:使用它可以讓頁面請求少量的數(shù)據(jù),而不用刷新整個頁面。基于什么答它基于的是。的庫答基于上面的原因,各種庫引用而生,然而最有名的就是的中的。它的一個優(yōu)勢異步操作,但的異步操作是基于事件的異步模型,沒有那么友好。
歡迎訪問我的個人博客:http://www.xiaolongwu.cn
基本知識答:Ajax是一種可以在瀏覽器和服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請求)的技術(shù)。使用它可以讓頁面請求少量的數(shù)據(jù),而不用刷新整個頁面。而傳統(tǒng)的頁面(不使用Ajax)要刷新部分內(nèi)容,必須重載整個網(wǎng)頁頁面。
答:它基于的是XMLHttpRequest(XHR)。這是一個比較粗糙的API,不符合關(guān)注分離的設(shè)計原則(Separation of Concerns),配置和使用都不是那么友好。
答:基于上面的原因,各種ajax庫引用而生,然而最有名的就是jQuery的API中的 $.ajax() 。 $.ajax() 它的一個優(yōu)勢異步操作,但jQuery的異步操作是基于事件的異步模型,沒有promise那么友好。
答:綜合上面所講的各種因素,fetch這個api應(yīng)運而生,它和XMLHttpRequest都是瀏覽器window對象的原生api。但好用歸好用,它存在著一些問題(這個問題下面詳講,并講解相對應(yīng)的解決方案),再加上兼容性問題(ie11以下壓根不支持),所以很多開發(fā)者使用了axios這個第三方庫。
答:axios 這個庫現(xiàn)在是一個比較通用的行業(yè)解決方案,axios 流行開來的一個原因是promise,另一個原因是基于數(shù)據(jù)操作的庫的流行(vue.js, angular.js, react.js等),而傳統(tǒng)的jQuery是基于dom操作的庫。但它也存在著缺陷,就是我們使用前,要保證這個庫已經(jīng)被引入。
其實,就我個人而言,我還是比較喜歡使用fetch的。在開發(fā)中遇到兼容性的問題,只需要同構(gòu)fetch即可,而不需要額外的引入一個庫。下面就重點說一下fetch。
fetch 的使用fetch(url, options) .then(response => console.log(responese)) .catch(err => console.log(err))
url:請求的地址
options: 請求的相關(guān)參數(shù)配置
response:請求返回的對象
then:正常返回數(shù)據(jù)
catch: 返回異常
請求參數(shù)配置 options 詳情可參考MDN fetch 我在這里就不再贅述
fetch存在的問題及解決方案fetch得到數(shù)據(jù)你需要兩個步驟
fetch("https://api.github.com/users") .then(res => { console.log(res) return res.text() }) .then(data => { console.log(data) })
fetch的使用需要瀏覽器支持promise, fetch的返回值也是一個promise對象;
通過上面的代碼,可以發(fā)現(xiàn)直接打印返回的 Response 對象中壓根就沒有數(shù)據(jù),要想獲取到所需的數(shù)據(jù),必須經(jīng)一個中間的方法 response.text() (fetch提供了5中方法),如下:
// 具體功能請自行查閱 arrayBuffer() blob() json() text() formData()
而fetch的封裝庫axios解決了這個問題,使用起來就要方便的多,它返回的 Response 對象中卻有數(shù)據(jù),在 data 屬性內(nèi)。參考代碼如下:
axios.get("https://api.github.com/users") .then(res => console.log(res));
fetch的請求默認是不帶 cookie
解決這個問題,需要在 options 中配置 {credentials: "include"}
并非所有的請求錯誤都會 reject
也就是說 catch 方法并不能捕獲所有的錯誤,當(dāng)錯誤可以用一個狀態(tài)碼(如:404,500等)的形式表示時,fetch 返回的 Promise 不會擁有reject,只有當(dāng)網(wǎng)絡(luò)故障或請求被阻止時 catch 才有效。
解決這個問題,我們可判斷 Response 對象中的 ok 是否為true,如果不是,用 Promise 手動添加一個 reject 即可。參考代碼如下:
fetch("https://api.github.com/usrs") .then(res => { if (res.ok) { return res.text() } else { return Promise.reject("請求失敗") } }) .then(data => { console.log(data) }) .catch(err => { console.log(err) })
當(dāng)然,如果是用axios庫就不需要考慮這個問題,因為axios已經(jīng)為我們封裝好了;
fetch和async、await在實際中一起使用async和await是es7的api,在實際開發(fā)中加入一些polyfill庫,比如最流行的的babel,我們就可以使用它們了;
如果你還不了解它們,請?zhí)D(zhuǎn)至:用async/await來處理異步
在實際中我們會經(jīng)常遇到異步嵌套的問題,比如:
fetch("https://api.github.com/usrs") .then(res => { if (res.ok) { return res.text() } else { return Promise.reject("請求失敗") } }) .then(data => { let url = data.url fetch(url) .then(res => { if (res.ok) { return res.text() } else { return Promise.reject("請求失敗") } }) .then(data => { console.log(data) }) }) .catch(err => { console.log(err) })
上面就是在收到相應(yīng)之后再發(fā)起一個請求,這樣的代碼是不是看著很難受;
下面我們來用async和await改一下,感受一下用同步的方式寫異步的感覺:
// 封裝aa async function aa() { try { let res = await fetch("https://api.github.com/usrs") let data = await res.text() let url = data.url let res1 = await fetch(url) let data1 = await res1.text() console.log(data) } catch(e) { console.log("error", e) } } // 調(diào)用aa aa()
看看上面的代碼是不是舒服多了 ,也簡單多了;
github資源地址:js基礎(chǔ)進階--從ajax到fetch的理解
我的CSDN博客地址:https://blog.csdn.net/wxl1555
如果您對我的博客內(nèi)容有疑惑或質(zhì)疑的地方,請在下方評論區(qū)留言,或郵件給我,共同學(xué)習(xí)進步。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101069.html
摘要:在函數(shù)式編程中,異步操作修改全局變量等與函數(shù)外部環(huán)境發(fā)生的交互叫做副作用通常認為這些操作是邪惡骯臟的,并且也是導(dǎo)致的源頭。 注:這篇是17年1月的文章,搬運自本人 blog... https://github.com/BuptStEve/... 零、前言 在上一篇中介紹了 Redux 的各項基礎(chǔ) api。接著一步一步地介紹如何與 React 進行結(jié)合,并從引入過程中遇到的各個痛點引出 ...
摘要:讓應(yīng)用程序擁有異步讀取存儲在用戶計算機上文件或原始數(shù)據(jù)緩沖區(qū)的能力,使用或?qū)ο笾付ㄒx取的文件或數(shù)據(jù)。對象用來表示通用的固定長度的原始二進制數(shù)據(jù)緩沖區(qū)。事實上,沒有名為的全局對象,也沒有一個名為的構(gòu)造函數(shù)。 Ajax 即 Asynchronous Javascript And XML (異步 JavaScript 和 XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。在無需重新加載整...
摘要:在有了基礎(chǔ)之后,進一步學(xué)習(xí)內(nèi)容包括框架。前端學(xué)習(xí)交流群禁止閑聊,非喜勿進。代碼提交前必須做的三個事情檢查所有變更跑一邊單元測試手動運行一遍所有 網(wǎng)站開發(fā)開發(fā)大致分為前端和后端,前端主要負責(zé)實現(xiàn)視覺和交互效果,以及與服務(wù)器通信,完成業(yè)務(wù)邏輯。其核心價值在于對用戶體驗的追求。可以按如下思路學(xué)習(xí)系統(tǒng)學(xué)習(xí): 基礎(chǔ)知識: html + css 這部分建議在?w3school 在線教程上學(xué)習(xí),邊...
摘要:在有了基礎(chǔ)之后,進一步學(xué)習(xí)內(nèi)容包括框架。前端學(xué)習(xí)交流群禁止閑聊,非喜勿進。代碼提交前必須做的三個事情檢查所有變更跑一邊單元測試手動運行一遍所有 網(wǎng)站開發(fā)開發(fā)大致分為前端和后端,前端主要負責(zé)實現(xiàn)視覺和交互效果,以及與服務(wù)器通信,完成業(yè)務(wù)邏輯。其核心價值在于對用戶體驗的追求。可以按如下思路學(xué)習(xí)系統(tǒng)學(xué)習(xí): 基礎(chǔ)知識: html + css 這部分建議在?w3school 在線教程上學(xué)習(xí),邊...
閱讀 2975·2023-04-26 01:52
閱讀 3507·2021-09-04 16:40
閱讀 3655·2021-08-31 09:41
閱讀 1802·2021-08-09 13:41
閱讀 591·2019-08-30 15:54
閱讀 2987·2019-08-30 11:22
閱讀 1645·2019-08-30 10:52
閱讀 973·2019-08-29 13:24