Fetch和Ajax的比較

今天朋友提到fetch和ajax的區(qū)別這個問題衔肢,我突然發(fā)現(xiàn)自己好像也不咋知道怎么回答,所以需要整理一下豁翎。

image.png

一角骤、Ajax

Ajax的本質是使用XMLHttpRequest對象來請求數(shù)據(jù),下面簡單貼下原生js實現(xiàn):

function ajax(url, fnSucc, fnFaild)
{
    //1.創(chuàng)建Ajax對象
    if(window.XMLHttpRequest){
       var oAjax=new XMLHttpRequest();
    }else{
       var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    //2.連接服務器(打開和服務器的連接)
    oAjax.open('GET', url, true);
    
    //3.發(fā)送
    oAjax.send();
    
    //4.接收
    oAjax.onreadystatechange=function (){
       if(oAjax.readyState==4){
           if(oAjax.status==200){
              //alert('成功了:'+oAjax.responseText);
              fnSucc(oAjax.responseText);
           }else{
              //alert('失敗了');
              if(fnFaild){
                  fnFaild();
              }
           }
        }
    };
}

二谨垃、fetch

fetch 是全局量 window 的一個方法启搂,它的主要特點有:
1、第一個參數(shù)是URL:
2刘陶、第二個是可選參數(shù)胳赌,可以控制不同配置的 init 對象
3、使用了 JavaScript Promises 來處理結果/回調:

// 鏈式處理,將異步變?yōu)轭愃茊尉€程的寫法: 高級用法.
fetch('/some/url').then(function(response) {
    return . //... 執(zhí)行成功, 第1步...
}).then(function(returnedValue) {
    // ... 執(zhí)行成功, 第2步...
}).catch(function(err) {
    // 中途任何地方出錯...在此處理 :( 
});

三匙隔、fetch規(guī)范與jQuery.ajax()主要有兩種方式的不同疑苫,牢記:

1、從 fetch()返回的 Promise 將<b>不會拒絕HTTP錯誤狀態(tài)</b>, 即使響應是一個 HTTP 404 或 500。相反捍掺,它會正常解決 (其中ok狀態(tài)設置為false), 并且僅在網絡故障時或任何阻止請求完成時撼短,它才會拒絕。
可以做簡單的封裝

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response
  } else {
    var error = new Error(response.statusText)
    error.response = response
    throw error
  }
}

function parseJSON(response) {
  return response.json()
}

fetch('/users')
  .then(checkStatus)
  .then(parseJSON)
  .then(function(data) {
    console.log('request succeeded with JSON response', data)
  }).catch(function(error) {
    console.log('request failed', error)
  })

2挺勿、默認情況下, fetch在服務端不會發(fā)送或接收任何 cookies, 如果站點依賴于維護一個用戶會話曲横,則導致未經認證的請求(要發(fā)送 cookies,必須發(fā)送憑據(jù)頭).
這一點也可以做一些處理:
如果想要在同域中自動發(fā)送cookie,加上 credentialssame-origin 選項

fetch(url, {
  credentials: ’same-origin'
})

same-origin值使得fetch處理Cookie與XMLHttpRequest類似不瓶。 否則禾嫉,Cookie將不會被發(fā)送,導致這些請求不保留認證會話蚊丐。

對于CORS請求熙参,使用include值允許將憑據(jù)發(fā)送到其他域:

fetch(url, {
  credentials: 'include'
})

四、總結

最后fetch采用了Promise的異步處理機制麦备,使用比ajax更加簡單孽椰,有可能會逐漸代替ajax,對于新技術大家還是要積極探索最好凛篙。
如有什么寫得不對的地方黍匾,歡迎批評指正

閱讀更多:

Fetch
HTTP access control (CORS)
Fetch polyfill
fetch使用的常見問題及其解決辦法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呛梆,隨后出現(xiàn)的幾起案子膀捷,更是在濱河造成了極大的恐慌,老刑警劉巖削彬,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秀仲,居然都是意外死亡融痛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門神僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雁刷,“玉大人,你說我怎么就攤上這事保礼∨胬” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵炮障,是天一觀的道長目派。 經常有香客問我,道長胁赢,這世上最難降的妖魔是什么企蹭? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上谅摄,老公的妹妹穿的比我還像新娘徒河。我一直安慰自己,他們只是感情好送漠,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布顽照。 她就那樣靜靜地躺著,像睡著了一般闽寡。 火紅的嫁衣襯著肌膚如雪代兵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天下隧,我揣著相機與錄音奢人,去河邊找鬼。 笑死淆院,一個胖子當著我的面吹牛何乎,可吹牛的內容都是我干的。 我是一名探鬼主播土辩,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼支救,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拷淘?” 一聲冷哼從身側響起各墨,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎启涯,沒想到半個月后贬堵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡结洼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年黎做,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松忍。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒸殿,死狀恐怖,靈堂內的尸體忽然破棺而出鸣峭,到底是詐尸還是另有隱情宏所,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布摊溶,位于F島的核電站爬骤,受9級特大地震影響,放射性物質發(fā)生泄漏莫换。R本人自食惡果不足惜盖腕,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一赫冬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溃列,春花似錦劲厌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雅任,卻和暖如春风范,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沪么。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工硼婿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禽车。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓寇漫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殉摔。 傳聞我的和親對象是個殘疾皇子州胳,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容

  • 本文詳細介紹了 XMLHttpRequest 相關知識,涉及內容: AJAX逸月、XMLHTTP栓撞、XMLHttpReq...
    semlinker閱讀 13,613評論 2 18
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)碗硬,斷路器瓤湘,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 原諒我做一次標題黨岭粤,Ajax 不會死,傳統(tǒng) Ajax 指的是 XMLHttpRequest(XHR)特笋,未來現(xiàn)在已被...
    9a9Hbx閱讀 14,971評論 17 161
  • 原諒我做一次標題黨猎物,Ajax 不會死,傳統(tǒng) Ajax 指的是 XMLHttpRequest(XHR)角塑,未來現(xiàn)在已被...
    茶藝瑤閱讀 1,325評論 0 4
  • 導讀 傳遞信息到服務器蔫磨,從服務器獲取信息,是前端發(fā)展的重中之重圃伶,尤其是現(xiàn)在前后端分離的大前提下堤如,前后端的數(shù)據(jù)交互是...
    Chris_dc閱讀 2,122評論 1 9