Fetch

fetch是一種HTTP數(shù)據(jù)請(qǐng)求的方式踩官,是XMLHttpRequest的一種替代方案逞度。fetch不是ajax的進(jìn)一步封裝,而是原生js。Fetch函數(shù)就是原生js碑定,沒(méi)有使用XMLHttpRequest對(duì)象天通。

ajax

  • 使用步驟
    1.創(chuàng)建XmlHttpRequest對(duì)象
    2.調(diào)用open方法設(shè)置基本請(qǐng)求信息
    3.設(shè)置發(fā)送的數(shù)據(jù)娃肿,發(fā)送請(qǐng)求
    4.注冊(cè)監(jiān)聽(tīng)的回調(diào)函數(shù)
    5.拿到返回值疾嗅,對(duì)頁(yè)面進(jìn)行更新
//1.創(chuàng)建Ajax對(duì)象
    if(window.XMLHttpRequest){
       var oAjax=new XMLHttpRequest();
    }else{
       var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
    }

    //2.連接服務(wù)器(打開(kāi)和服務(wù)器的連接)
    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

  • 特點(diǎn)
    1、第一個(gè)參數(shù)是URL:
    2谴蔑、第二個(gè)是可選參數(shù)豌骏,可以控制不同配置的 init 對(duì)象
    3、使用了 JavaScript Promises 來(lái)處理結(jié)果/回調(diào):
fetch(url).then(response => response.json())
  .then(data => console.log(data))
  .catch(e => console.log("Oops, error", e))
  • 更酷的一點(diǎn)
    你可以通過(guò)Request構(gòu)造器函數(shù)創(chuàng)建一個(gè)新的請(qǐng)求對(duì)象隐锭,你還可以基于原有的對(duì)象創(chuàng)建一個(gè)新的對(duì)象窃躲。 新的請(qǐng)求和舊的并沒(méi)有什么不同,但你可以通過(guò)稍微調(diào)整配置對(duì)象钦睡,將其用于不同的場(chǎng)景蒂窒。例如:
var req = new Request(URL, {method: 'GET', cache: 'reload'});
fetch(req).then(function(response) {
  return response.json();
}).then(function(json) {
  insertPhotos(json);
});

上面的代碼中我們指明了請(qǐng)求使用的方法為GET,并且指定不緩存響應(yīng)的結(jié)果荞怒,你可以基于原有的GET請(qǐng)求創(chuàng)建一個(gè)POST請(qǐng)求洒琢,它們具有相同的請(qǐng)求源。代碼如下:

// 基于req對(duì)象創(chuàng)建新的postReq對(duì)象
var postReq = new Request(req, {method: 'POST'});

fetch和ajax 的主要區(qū)別

1褐桌、fetch()返回的promise將不會(huì)拒絕http的錯(cuò)誤狀態(tài)纬凤,即使響應(yīng)是一個(gè)HTTP 404或者500
2、在默認(rèn)情況下 fetch不會(huì)接受或者發(fā)送cookies

fetch的配置

Promise fetch(String url [, Object options]);
Promise fetch(Request req [, Object options]);
更多配置

fetch封裝

export default async(url = '', data = {}, type = 'GET', method = 'fetch') => {
    type = type.toUpperCase();
    url = baseUrl + url;

    if (type == 'GET') {
        let dataStr = ''; //數(shù)據(jù)拼接字符串
        Object.keys(data).forEach(key => {
            dataStr += key + '=' + data[key] + '&';
        })

        if (dataStr !== '') {
            dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
            url = url + '?' + dataStr;
        }
    }

    if (window.fetch && method == 'fetch') {
        let requestConfig = {
            credentials: 'include',//為了在當(dāng)前域名內(nèi)自動(dòng)發(fā)送 cookie 撩嚼, 必須提供這個(gè)選項(xiàng)
            method: type,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            mode: "cors",//請(qǐng)求的模式
            cache: "force-cache"
        }

        if (type == 'POST') {
            Object.defineProperty(requestConfig, 'body', {
                value: JSON.stringify(data)
            })
        }
        
        try {
            const response = await fetch(url, requestConfig);
            const responseJson = await response.json();
            return responseJson
        } catch (error) {
            throw new Error(error)
        }
    } else {
        return new Promise((resolve, reject) => {
            let requestObj;
            if (window.XMLHttpRequest) {
                requestObj = new XMLHttpRequest();
            } else {
                requestObj = new ActiveXObject;
            }

            let sendData = '';
            if (type == 'POST') {
                sendData = JSON.stringify(data);
            }

            requestObj.open(type, url, true);
            requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            requestObj.send(sendData);

            requestObj.onreadystatechange = () => {
                if (requestObj.readyState == 4) {
                    if (requestObj.status == 200) {
                        let obj = requestObj.response
                        if (typeof obj !== 'object') {
                            obj = JSON.parse(obj);
                        }
                        resolve(obj)
                    } else {
                        reject(requestObj)
                    }
                }
            }
        })
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挖帘,隨后出現(xiàn)的幾起案子完丽,更是在濱河造成了極大的恐慌,老刑警劉巖拇舀,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逻族,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骄崩,警方通過(guò)查閱死者的電腦和手機(jī)聘鳞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)要拂,“玉大人抠璃,你說(shuō)我怎么就攤上這事⊥讯瑁” “怎么了搏嗡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我采盒,道長(zhǎng)旧乞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任磅氨,我火速辦了婚禮尺栖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烦租。我一直安慰自己延赌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布左权。 她就那樣靜靜地躺著皮胡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赏迟。 梳的紋絲不亂的頭發(fā)上屡贺,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音锌杀,去河邊找鬼甩栈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糕再,可吹牛的內(nèi)容都是我干的量没。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼突想,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殴蹄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猾担,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袭灯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绑嘹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稽荧,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年工腋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姨丈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡擅腰,死狀恐怖蟋恬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趁冈,我是刑警寧澤筋现,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響矾飞,放射性物質(zhì)發(fā)生泄漏一膨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一洒沦、第九天 我趴在偏房一處隱蔽的房頂上張望豹绪。 院中可真熱鬧,春花似錦申眼、人聲如沸瞒津。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巷蚪。三九已至,卻和暖如春濒翻,著一層夾襖步出監(jiān)牢的瞬間屁柏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工有送, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淌喻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓雀摘,卻偏偏與公主長(zhǎng)得像裸删,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阵赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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