Ajax, Axios, Fetch區(qū)別

本文將會根據(jù)自己的理解,來闡述Ajax, Axios, Fetch他們之間的區(qū)別

1 、JQuery ajax

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

Ajax是對原生XHR的封裝,為了達(dá)到我們跨越的目的,增添了對JSONP的支持。經(jīng)過這么多年的更新維護(hù),不得不承認(rèn)它已經(jīng)很成熟,能夠滿足我們的基本需求,但是隨著react,vue新一代框架的興起,以及ES規(guī)范的完善,更多API的更新,它逐漸暴露了自己的不足

  • 針對MVC的編程設(shè)計,不符合現(xiàn)在前端MVVM的趨勢
  • 基于原生的XHR開發(fā),XHR本身的架構(gòu)不夠清晰
  • JQuery較大,單純使用ajax卻要引入整個JQuery非常的不合理
  • 雖然axios不支持jsonp,但是可以通過引入jsonp模塊來解決

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快速的得到大家的關(guān)注。Axios本質(zhì)就是對原生XHR的封裝,增加了Promise的實,符合最新的ES規(guī)范,從它的官網(wǎng)上可以看到它有以下幾條特性:

  • 從 node.js 創(chuàng)建 http 請求
  • 支持 Promise API
  • 客戶端支持防止CSRF(請求中攜帶cookie)
  • 提供了一些并發(fā)請求的接口(重要,方便了很多的操作)

Axios既提供了并發(fā)的封裝,體積也較小,也沒有下文會提到的fetch的各種問題,當(dāng)之無愧是現(xiàn)在最應(yīng)該選用的請求的方式。

3、 Fetch

fetch號稱是AJAX的替代品,fetch是基于原生的XMLHttpRequest對象來實現(xiàn)數(shù)據(jù)請求的,同時也是基于Promise實現(xiàn)鏈?zhǔn)秸{(diào)用的。它的好處在《傳統(tǒng) Ajax 已死,F(xiàn)etch 永生》中提到有以下幾點:

  • 符合關(guān)注分離,沒有將輸入、輸出和用事件來跟蹤的狀態(tài)混雜在一個對象里
  • 更好更方便的寫法,諸如:
try {
  let response = await fetch(url);
  let data = await response.json();
  console.log(data);
} catch(e) {
  console.log("error:", e);
}

使用 await 后,告別面條式調(diào)用,將異步寫成同步,身心舒暢。從上圖可以看到await 后面可以跟 Promise 對象,表示等待 Promise resolve() 才會繼續(xù)向下執(zhí)行,如果 Promise 被 reject() 或拋出異常則會被外面的 try...catch 捕獲。

坦白說,Jquery還是Axios都已經(jīng)將xhr封裝的足夠好,使用起來也足夠方便,但是Fetch還是得到很多開發(fā)者的認(rèn)可,說明它還是存在很多優(yōu)勢的:

  • 更加底層,提供的API豐富(request, response)
  • 脫離了XHR,是ES規(guī)范里新的實現(xiàn)方式
  • 跨域處理(mode為"no-cors")
fetch('/testPost', {
    method: 'post',
    mode: 'no-cors',
    data: {}
}).then(function() {});

但是在使用fetch的時候,也會遇到了一些問題:

  • fetch只對網(wǎng)絡(luò)請求報錯,對400,500都當(dāng)做成功的請求,需要封裝去處理
  • fetch默認(rèn)不會帶cookie,需要添加配置項fetch(url, {credentials: 'include'})
  • fetch不支持abort,不支持超時控制,使用setTimeout及Promise.reject的實現(xiàn)的超時控制并不能阻止請求過程繼續(xù)在后臺運行,造成了流量的浪費
  • fetch沒有辦法原生監(jiān)測請求的進(jìn)度,而XHR可以
  • 所有版本的 IE 均不支持原生 Fetch,fetch-ie8 會自動使用 XHR 做 polyfill。但在跨域時有個問題需要處理。IE8, 9 的 XHR 不支持 CORS 跨域,不支持傳 Cookie!所以推薦使用 fetch-jsonp

PS: fetch的具體問題大家可以參考:《fetch沒有你想象的那么美》《fetch使用的常見問題及解決方法



xhr+promise的實現(xiàn)原理如下:

function Promise(fn) { 
  this.resolveFn = null; 
  this.rejectFn = null; 
  var _this = this; 
  function resolve(data) { 
    var f = _this.resolveFn; 
    f(data);
 }
  function reject(err) { 
    var f = this.rejectFn;
     f(err); 
 } 
  fn(resolve,reject);
}
Promise.prototype.then = function (f) { 
  this.resolveFn = f; return this; 
}; 
Promise.prototype.catch = function (f) { 
  this.rejectFn = f; return this; 
}; 
function ajax(url,suc,fail) { 
  var xhr = new XMLHttpRequest(); 
  xhr.open('GET',url, true); 
  xhr.onreadystatechange = function () { 
    if(xhr.readyState == 4){
      if(xhr.status == 200){ 
        suc(xhr.responseText) 
      } else { 
        console.log(err); 
        fail(xhr.responseText); 
    }
 } 
};
  xhr.send(null); 
} 
function fetch(url) { 
  console.log('fetch start') 
  return new Promise(function (resolve,reject) { 
    ajax(url,function (res) { 
      resolve(res); 
    },function (err) { 
      console.log(err);
      reject(err); 
    }) 
  }) 
} 

fetch('/test').then(function (res) { 
  console.log(JSON.parse(res)); 
}).catch (function (err) { 
  console.log(err); 
}) 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內(nèi)容