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