ajax和axios功蜓、fetch的區(qū)別

1.jQuery ajax

```$.ajax({type:'POST',url: url,data: data,dataType: dataType,success:function(){},error:function(){}});```

傳統(tǒng) Ajax 指的是 XMLHttpRequest(XHR)变丧, 最早出現(xiàn)的發(fā)送后端請(qǐng)求技術(shù)序苏,隸屬于原始js中蚕苇,核心使用XMLHttpRequest對(duì)象松申,多個(gè)請(qǐng)求之間如果有先后關(guān)系的話灿里,就會(huì)出現(xiàn)回調(diào)地獄朱灿。

JQuery ajax 是對(duì)原生XHR的封裝,除此以外還增添了對(duì)JSONP的支持钠四。經(jīng)過(guò)多年的更新維護(hù)盗扒,真的已經(jīng)是非常的方便了,優(yōu)點(diǎn)無(wú)需多言缀去;如果是硬要舉出幾個(gè)缺點(diǎn)侣灶,那可能只有:

1.本身是針對(duì)MVC的編程,不符合現(xiàn)在前端MVVM的浪潮

2.基于原生的XHR開(kāi)發(fā),XHR本身的架構(gòu)不清晰缕碎。

3.JQuery整個(gè)項(xiàng)目太大褥影,單純使用ajax卻要引入整個(gè)JQuery非常的不合理(采取個(gè)性化打包的方案又不能享受CDN服務(wù))

4.不符合關(guān)注分離(Separation of Concerns)的原則

5.配置和調(diào)用方式非常混亂咏雌,而且基于事件的異步模型不友好凡怎。

PS:MVVM(Model-View-ViewModel), 源自于經(jīng)典的 Model–View–Controller(MVC)模式。MVVM 的出現(xiàn)促進(jìn)了 GUI 前端開(kāi)發(fā)與后端業(yè)務(wù)邏輯的分離赊抖,極大地提高了前端開(kāi)發(fā)效率统倒。MVVM 的核心是 ViewModel 層,它就像是一個(gè)中轉(zhuǎn)站(value converter)氛雪,負(fù)責(zé)轉(zhuǎn)換 Model 中的數(shù)據(jù)對(duì)象來(lái)讓數(shù)據(jù)變得更容易管理和使用房匆,該層向上與視圖層進(jìn)行雙向數(shù)據(jù)綁定,向下與 Model 層通過(guò)接口請(qǐng)求進(jìn)行數(shù)據(jù)交互,起呈上啟下作用浴鸿。View 層展現(xiàn)的不是 Model 層的數(shù)據(jù)井氢,而是 ViewModel 的數(shù)據(jù),由 ViewModel 負(fù)責(zé)與 Model 層交互岳链,這就完全解耦了 View 層和 Model 層花竞,這個(gè)解耦是至關(guān)重要的,它是前后端分離方案實(shí)施的最重要一環(huán)掸哑。

如下圖所示:

image.png

2.axios

axios({method:'post',url:'/user/12345',data: {firstName:'Fred',lastName:'Flintstone'}}).then(function(response){console.log(response);}).catch(function(error){console.log(error);});

Vue2.0之后约急,尤雨溪推薦大家用axios替換JQuery ajax,想必讓axios進(jìn)入了很多人的目光中举户。

axios 是一個(gè)基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端,本質(zhì)上也是對(duì)原生XHR的封裝遍烦,只不過(guò)它是Promise的實(shí)現(xiàn)版本俭嘁,符合最新的ES規(guī)范,它本身具有以下特征:

1.從瀏覽器中創(chuàng)建 XMLHttpRequest

2.支持 Promise API

3.客戶端支持防止CSRF

4.提供了一些并發(fā)請(qǐng)求的接口(重要服猪,方便了很多的操作)

5.從 node.js 創(chuàng)建 http 請(qǐng)求

6.攔截請(qǐng)求和響應(yīng)

7.轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù)

8.取消請(qǐng)求

9.自動(dòng)轉(zhuǎn)換JSON數(shù)據(jù)

PS:防止CSRF:就是讓你的每個(gè)請(qǐng)求都帶一個(gè)從cookie中拿到的key, 根據(jù)瀏覽器同源策略供填,假冒的網(wǎng)站是拿不到你cookie中得key的,這樣罢猪,后臺(tái)就可以輕松辨別出這個(gè)請(qǐng)求是否是用戶在假冒網(wǎng)站上的誤導(dǎo)輸入近她,從而采取正確的策略。

3.fetch

try{letresponse =awaitfetch(url);letdata = response.json();console.log(data);}catch(e) {console.log("Oops, error", e);}

fetch號(hào)稱是AJAX的替代品膳帕,是在ES6出現(xiàn)的粘捎,使用了ES6中的promise對(duì)象。Fetch是基于promise設(shè)計(jì)的危彩。Fetch的代碼結(jié)構(gòu)比起ajax簡(jiǎn)單多了攒磨,參數(shù)有點(diǎn)像jQuery ajax。但是汤徽,一定記住fetch不是ajax的進(jìn)一步封裝娩缰,而是原生js,沒(méi)有使用XMLHttpRequest對(duì)象谒府。

fetch的優(yōu)點(diǎn):

1.符合關(guān)注分離拼坎,沒(méi)有將輸入、輸出和用事件來(lái)跟蹤的狀態(tài)混雜在一個(gè)對(duì)象里

2.更好更方便的寫(xiě)法

坦白說(shuō)完疫,上面的理由對(duì)我來(lái)說(shuō)完全沒(méi)有什么說(shuō)服力泰鸡,因?yàn)椴还苁荍query還是Axios都已經(jīng)幫我們把xhr封裝的足夠好,使用起來(lái)也足夠方便壳鹤,為什么我們還要花費(fèi)大力氣去學(xué)習(xí)fetch鸟顺?

我認(rèn)為fetch的優(yōu)勢(shì)主要優(yōu)勢(shì)就是:

1.語(yǔ)法簡(jiǎn)潔,更加語(yǔ)義化2.基于標(biāo)準(zhǔn)Promise實(shí)現(xiàn),支持async/await3.同構(gòu)方便讯嫂,使用 [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)4.更加底層蹦锋,提供的API豐富(request, response)5.脫離了XHR,是ES規(guī)范里新的實(shí)現(xiàn)方式

最近在使用fetch的時(shí)候欧芽,也遇到了不少的問(wèn)題:

fetch是一個(gè)低層次的API莉掂,你可以把它考慮成原生的XHR,所以使用起來(lái)并不是那么舒服千扔,需要進(jìn)行封裝憎妙。

例如:

1)fetch只對(duì)網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò),對(duì)400曲楚,500都當(dāng)做成功的請(qǐng)求厘唾,服務(wù)器返回 400,500 錯(cuò)誤碼時(shí)并不會(huì)reject龙誊,只有網(wǎng)絡(luò)錯(cuò)誤這些導(dǎo)致請(qǐng)求不能完成時(shí)抚垃,fetch才會(huì)被reject。2)fetch默認(rèn)不會(huì)帶cookie趟大,需要添加配置項(xiàng):fetch(url, {credentials:'include'})3)fetch不支持abort鹤树,不支持超時(shí)控制,使用setTimeout及Promise.reject的實(shí)現(xiàn)的超時(shí)控制并不能阻止請(qǐng)求過(guò)程繼續(xù)在后臺(tái)運(yùn)行逊朽,造成了流量的浪費(fèi)4)fetch沒(méi)有辦法原生監(jiān)測(cè)請(qǐng)求的進(jìn)度罕伯,而XHR可以

總結(jié):axios既提供了并發(fā)的封裝,也沒(méi)有fetch的各種問(wèn)題叽讳,而且體積也較小追他,當(dāng)之無(wú)愧現(xiàn)在最應(yīng)該選用的請(qǐng)求的方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岛蚤,一起剝皮案震驚了整個(gè)濱河市湿酸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灭美,老刑警劉巖推溃,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異届腐,居然都是意外死亡铁坎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)犁苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)硬萍,“玉大人,你說(shuō)我怎么就攤上這事围详∑庸裕” “怎么了祖屏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)买羞。 經(jīng)常有香客問(wèn)我袁勺,道長(zhǎng),這世上最難降的妖魔是什么畜普? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任期丰,我火速辦了婚禮,結(jié)果婚禮上吃挑,老公的妹妹穿的比我還像新娘钝荡。我一直安慰自己,他們只是感情好舶衬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布埠通。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音横蜒,去河邊找鬼。 笑死贫贝,一個(gè)胖子當(dāng)著我的面吹牛热幔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播众雷,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灸拍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砾省?” 一聲冷哼從身側(cè)響起鸡岗,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎编兄,沒(méi)想到半個(gè)月后轩性,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狠鸳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年揣苏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件舵。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸察,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铅祸,到底是詐尸還是另有隱情坑质,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站涡扼,受9級(jí)特大地震影響稼跳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壳澳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一岂贩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巷波,春花似錦萎津、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至垮耳,卻和暖如春颈渊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背终佛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工俊嗽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃彰。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓绍豁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牙捉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竹揍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360