ajax、axios注暗、fetch

fetch:

是一種HTTP數(shù)據(jù)請(qǐng)求的方式坛缕,是XMLHttpRequest的一種替代方案。fetch不是ajax的進(jìn)一步封裝捆昏,而是原生js赚楚。Fetch函數(shù)就是原生js,沒(méi)有使用XMLHttpRequest對(duì)象骗卜。
具體fetch內(nèi)容:
http://undefinedblog.com/window-fetch-is-not-as-good-as-you-imagined/?utm_source=caibaojian.com

缺點(diǎn):
  • fetch只對(duì)網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò)宠页,對(duì)400,500都當(dāng)做成功的請(qǐng)求寇仓,需要封裝去處理
  • fetch對(duì)請(qǐng)求回來(lái)的json格式是ReadableStream流的形式举户。
  • fetch默認(rèn)不會(huì)帶cookie,需要添加配置項(xiàng)fetch(url, {credentials: 'include'})
  • fetch不支持abort遍烦,不支持超時(shí)控制俭嘁,使用setTimeout及Promise.reject的實(shí)現(xiàn)的超時(shí)控制并不能阻止請(qǐng)求過(guò)程繼續(xù)在后臺(tái)運(yùn)行,造成了流量的浪費(fèi)
  • fetch沒(méi)有辦法原生監(jiān)測(cè)請(qǐng)求的進(jìn)度服猪,而XHR可以
  • 所有版本的 IE 均不支持原生 Fetch兄淫,fetch-ie8 會(huì)自動(dòng)使用 XHR 做 polyfill屯远。但在跨域時(shí)有個(gè)問(wèn)題需要處理。IE8, 9 的 XHR 不支持 CORS 跨域捕虽,不支持傳 Cookie慨丐!所以推薦使用 fetch-jsonp
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 {   //ajax+promise
        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)
                    }
                }
            }
        })
    }
}

axios:

具體點(diǎn):中文:https://www.kancloud.cn/yunye/axios/234845
官方:http://www.axios-js.com/docs/

  1. 從 node.js 創(chuàng)建 http 請(qǐng)求
  2. 支持 Promise API
  3. 客戶(hù)端支持防止CSRF(請(qǐng)求中攜帶cookie)
  4. 提供了一些并發(fā)請(qǐng)求的接口(重要泄私,方便了很多的操作)
  5. 豐富的api, Interceptors, 并發(fā):
1)各種ajax的api別名房揭,
  • axios.request(config)

  • axios.get(url[, config])

  • axios.delete(url[, config])

  • axios.head(url[, config])

  • axios.post(url[, data[, config]])

  • axios.put(url[, data[, config]])

  • axios.patch(url[, data[, config]])

const axios = require('axios');

// Make a request for a user with a given ID
axios.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// Optionally the request above could also be done as
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .then(function () {
    // always executed
  });  

// Want to use async/await? Add the `async` keyword to your outer function/method.
async function getUser() {
  try {
    const response = await axios.get('/user?ID=12345');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

2)創(chuàng)建實(shí)例,還有一些實(shí)例方法

axios.create([config])

var instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

實(shí)例方法:

  • axios#request(config)

  • axios#get(url[, config])

  • axios#delete(url[, config])

  • axios#head(url[, config])

  • axios#post(url[, data[, config]])

  • axios#put(url[, data[, config]])

  • axios#patch(url[, data[, config]])

3)處理并發(fā)請(qǐng)求的助手函數(shù):

a. axios.all(iterable)
b. axios.spread(callback)

4)攔截器:
// 添加請(qǐng)求攔截器
axios.interceptors.request.use(function (config) {
    // 在發(fā)送請(qǐng)求之前做些什么
    return config;
  }, function (error) {
    // 對(duì)請(qǐng)求錯(cuò)誤做些什么
    return Promise.reject(error);
  });

// 添加響應(yīng)攔截器
axios.interceptors.response.use(function (response) {
    // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
    return response;
  }, function (error) {
    // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
    return Promise.reject(error);
  });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晌端,隨后出現(xiàn)的幾起案子捅暴,更是在濱河造成了極大的恐慌,老刑警劉巖咧纠,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓬痒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漆羔,警方通過(guò)查閱死者的電腦和手機(jī)梧奢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)演痒,“玉大人亲轨,你說(shuō)我怎么就攤上這事∧袼常” “怎么了惦蚊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讯嫂。 經(jīng)常有香客問(wèn)我蹦锋,道長(zhǎng),這世上最難降的妖魔是什么欧芽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任晕粪,我火速辦了婚禮,結(jié)果婚禮上渐裸,老公的妹妹穿的比我還像新娘巫湘。我一直安慰自己,他們只是感情好昏鹃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布尚氛。 她就那樣靜靜地躺著,像睡著了一般洞渤。 火紅的嫁衣襯著肌膚如雪阅嘶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音讯柔,去河邊找鬼抡蛙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魂迄,可吹牛的內(nèi)容都是我干的粗截。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捣炬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熊昌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起湿酸,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤婿屹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后推溃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昂利,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年铁坎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜂奸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厢呵,死狀恐怖窝撵,靈堂內(nèi)的尸體忽然破棺而出傀顾,到底是詐尸還是另有隱情襟铭,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布短曾,位于F島的核電站寒砖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫉拐。R本人自食惡果不足惜哩都,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婉徘。 院中可真熱鬧漠嵌,春花似錦、人聲如沸盖呼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)几晤。三九已至约炎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圾浅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工掠手, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狸捕。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓喷鸽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親府寒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魁衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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