xhr、$ajax累魔、fetch摔笤、axios的異同

原生xhr對象

現(xiàn)代瀏覽器,最開始與服務(wù)器交換數(shù)據(jù)垦写,都是通過XMLHttpRequest對象吕世。它可以使用JSON、XML梯投、HTML和text文本等格式發(fā)送和接收數(shù)據(jù)命辖。

好處:

不重新加載頁面的情況下更新網(wǎng)頁

在頁面已加載后從服務(wù)器請求/接收數(shù)據(jù)

在后臺向服務(wù)器發(fā)送數(shù)據(jù)况毅。

缺點:

使用起來也比較繁瑣,需要設(shè)置很多值尔艇。

早期的IE瀏覽器有自己的內(nèi)置對象尔许,這樣需要寫兼容代碼判斷是否為XMLHttpRequest對象。


if (window.XMLHttpRequest) { // model browser

  xhr = new XMLHttpRequest()

} else if (window.ActiveXObject) { // IE 6 and older

  xhr = new ActiveXObject('Microsoft.XMLHTTP')

}

xhr.open('POST', url, true)

xhr.send(data)

xhr.onreadystatechange = function () {

  try {

    // TODO 處理響應(yīng)

    if (xhr.readyState === XMLHttpRequest.DONE) {

      // XMLHttpRequest.DONE 對應(yīng)值是 4

      // Everything is good, the response was received.

      if (xhr.status === 200) {

        // Perfect!

      } else {

        // There was a problem with the request.

        // For example, the response may hava a 404 (Not Found)

        // or 500 (Internal Server Error) response code.

      }

    } else {

      // Not ready yet

    }

  } catch (e) {

    // 通信錯誤的事件中(例如服務(wù)器宕機)

    alert('Caught Exception: ' + e.description)

  }

}




jQuery里的$.ajax

為了方便操作dom并避免一些瀏覽器兼容問題终娃,產(chǎn)生了jquery味廊,

它里面的AJAX請求也兼容了不同的瀏覽器,可以直接使用.get棠耕、.pist余佛。它就是對XMLHttpRequest對象的一層封裝

優(yōu)點:

對原生XHR的封裝,做了兼容處理窍荧,簡化了使用辉巡。

增加了對JSONP的支持,可以簡單處理部分跨域蕊退。

缺點:

如果有多個請求郊楣,并且有依賴關(guān)系的話,容易形成回調(diào)地獄瓤荔。

本身是針對MVC的編程净蚤,不符合現(xiàn)在前端MVVM的浪潮。

ajax是jQuery中的一個方法茉贡。如果只是要使用ajax卻要引入整個jQuery非常的不合理塞栅。




axios

Axios是一個基于promise的HTTP庫,可以用在瀏覽器和 node.js 中腔丧。它本質(zhì)也是對原生XMLHttpRequest的封裝放椰,只不過它是Promise的實現(xiàn)版本,符合最新的ES規(guī)范愉粤。

優(yōu)點:

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

  2. 從 node.js 創(chuàng)建 http 請求

  3. 支持 Promise API

  4. 攔截請求和響應(yīng)

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

  6. 取消請求

  7. 自動轉(zhuǎn)換 JSON 數(shù)據(jù)

  8. 客戶端支持防止CSPRF

  9. 提供了一些并發(fā)請求的接口

缺點:

只持現(xiàn)代代瀏覽器.


axios({

    method: 'post',

    url: '/userlist/all',

    data: {

      id: '1',

      page:1,

      limit: 20

    }

  })

  .then(res => console.log(res))

  .catch(err => console.log(err))




fetch

Fetch API提供了一個 JavaScript 接口砾医,用于訪問和操作HTTP管道的部分,例如請求和響應(yīng)衣厘。它還提供了一個全局fetch()方法如蚜,該方法提供了一種簡單,合理的方式來跨網(wǎng)絡(luò)異步獲取資源影暴。

fetch是低層次的API错邦,代替XHR,可以輕松處理各種格式型宙,非文本化格式撬呢。可以很容易的被其他技術(shù)使用妆兑,例如Service Workers魂拦。但是想要很好的使用fetch毛仪,需要做一些封裝處理。


fetch('http://acccess/.json')

  .then(function(response) {

    return response.json();

  })

  .then(function(myJson) {

    console.log(myJson);

  });

  //在配置中芯勘,添加mode: 'no-cors'就可以跨域了

  fetch('/users.json', {

    method: 'post',

    mode: 'no-cors',

    data: {}

}).then(function() { /* handle response */ });

優(yōu)點:

  1. 語法簡介箱靴,更加語義化

  2. 基于標(biāo)準(zhǔn)promise實現(xiàn),支持async/await

  3. 更加底層荷愕,提供的API豐富(request,response)

  4. 脫離了XHR衡怀,是Es規(guī)范里新的實現(xiàn)方式

問題:

  1. 支隊網(wǎng)絡(luò)請求報錯,也就是說只有網(wǎng)絡(luò)錯誤這些導(dǎo)致請求不能完成時他才會調(diào)用reject路翻,而對400狈癞,500這種錯誤它并不會reject

  2. 默認不會帶cookie茄靠,需要添加配置項:fetch(url,{credentials:'include'})

  3. 不支持abort茂契,不支持超時控制,使用setTimeout及promise.reject的實現(xiàn)的超時控制不能阻止請求過程繼續(xù)在后臺運行慨绳,會造成流量的浪費

  4. fetch沒辦法原生檢測請求的進度掉冶,XHR可以

1 當(dāng)接收到一個代表錯誤的 HTTP 狀態(tài)碼時,從 fetch()返回的 Promise 不會被標(biāo)記為 reject脐雪, 即使該 HTTP 響應(yīng)的狀態(tài)碼是 404 或 500厌小。相反,它會將 Promise 狀態(tài)標(biāo)記為 resolve (但是會將 resolve的返回值的 ok 屬性設(shè)置為 false )战秋,僅當(dāng)網(wǎng)絡(luò)故障時或請求被阻止時璧亚,才會標(biāo)記為 reject。

2 認情況下脂信,fetch 不會從服務(wù)端發(fā)送或接收任何 cookies, 如果站點依賴于用戶 session癣蟋,則會導(dǎo)致未經(jīng)認證的請求(要發(fā)送 cookies,必須設(shè)置 credentials 選項)狰闪。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疯搅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子埋泵,更是在濱河造成了極大的恐慌幔欧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽声,死亡現(xiàn)場離奇詭異礁蔗,居然都是意外死亡,警方通過查閱死者的電腦和手機雁社,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門浴井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歧胁,你說我怎么就攤上這事滋饲±鞯” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵屠缭,是天一觀的道長箍鼓。 經(jīng)常有香客問我,道長呵曹,這世上最難降的妖魔是什么款咖? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奄喂,結(jié)果婚禮上铐殃,老公的妹妹穿的比我還像新娘。我一直安慰自己跨新,他們只是感情好富腊,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著域帐,像睡著了一般赘被。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肖揣,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天民假,我揣著相機與錄音,去河邊找鬼龙优。 笑死羊异,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彤断。 我是一名探鬼主播野舶,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦糟!你這毒婦竟也來了筒愚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤菩浙,失蹤者是張志新(化名)和其女友劉穎巢掺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲蜻,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡陆淀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了先嬉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧苫。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出含懊,到底是詐尸還是另有隱情身冬,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布岔乔,位于F島的核電站酥筝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雏门。R本人自食惡果不足惜嘿歌,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茁影。 院中可真熱鬧宙帝,春花似錦、人聲如沸募闲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝇更。三九已至沪编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間年扩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工访圃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厨幻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓腿时,卻偏偏與公主長得像况脆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子批糟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354