axios 請求響應(yīng)攔截器簡單實現(xiàn) 中間件

axios是結(jié)合promise一起使用的译红,其中重要的一點是使用了promise.resolve()和對應(yīng)的promise.then();

先來看一個例子:

const axios = (config) => {
    console.log(config);
    if (config.error) {
        return Promise.reject({
            error: "error in axios"
        });
    } else {
        return Promise.resolve({
            ...config,
            result: config.result,
        });
    }
};
//執(zhí)行axios方法
axios({
    error: "",
    result: 'jack',
}).then(res => {
    console.log('res= ', res);
}).catch(err => {
    console.log('err=> ', err);
});

當執(zhí)行上面的axios方法的時候嘉抓,會隨著傳入?yún)?shù)的判斷處理炕倘,執(zhí)行對應(yīng)的then里面的函數(shù)回調(diào)方法烛芬,從而達到異步數(shù)據(jù)流的控制读规。


攔截器實現(xiàn)思路:

我們可以通過設(shè)置一個操作鏈按声,存儲請求攔截操作、響應(yīng)攔截操作终蒂,通過promise的異步流達到依次順序執(zhí)行的目的蜂林。

//自定義axios
const axios = {
    config: {
        url: '/',
        method: 'get',
        baseURL: "",
        params: {},
    }
};
//存儲請求遥诉、響應(yīng)攔截操作函數(shù)
axios.interceptors = {
    request: [],
    response: [],
};
//調(diào)用攔截器的時候,將攔截操作方法加入攔截器操作鏈
axios.interceptors.request.use = (resolved, rejected) => {
    axios.interceptors.request.push({ resolved, rejected });
};
axios.interceptors.response.use = (resolved, rejected) => {
    axios.interceptors.response.push({ resolved, rejected });
};
//axios網(wǎng)絡(luò)請求的核心操作
axios.action = (config) => {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open(config.method, config.baseURL + config.url, true);
        xhr.onload = () => {
            // console.log(xhr.status);
            // console.log(xhr.responseText);
            resolve(xhr.responseText);
        };
        xhr.onerror = () => {
            //console.log('======== xhr.error');
            reject('xhr error 錯誤');
        };
        xhr.send();
    });
};
//axios執(zhí)行噪叙,調(diào)用攔截器處理
axios.run = (config) => {
    //console.log('config --- ', config);
    const chain = [
        {
            resolved: axios.action,
            rejected: undefined
        }
    ];

    axios.interceptors.request.forEach(interceptor => {
        chain.unshift(interceptor);
    });

    axios.interceptors.response.forEach(interceptor => {
        chain.push(interceptor);
    });

    let promise = Promise.resolve(config);

    while (chain.length) {
        const { resolved, rejected } = chain.shift();
        promise = promise.then(resolved, rejected);
    }

    return promise;
};
//get請求
axios.get = (url) => {
    axios.config.method = 'get';
    axios.config.url = url;
    return axios.run(axios.config);
};
//post請求
axios.post = (url) => {
    axios.config.method = 'post';
    axios.config.url = url;
    return axios.run(axios.config);
};
//導(dǎo)出axios
export default axios;

自定義axios的使用:

import axios from './myAxios.js';

const getBtn = document.querySelector('#get');
const postBtn = document.querySelector('#post');
//axios的請求配置
axios.config.baseURL = "http://localhost:9000";

//get請求
getBtn.onclick = (e)=>{
    //console.log('eee, ', e.target);
    axios.get("/getData").then(res=>{
        console.log('get request result = ', res);
        alert(res);
    }).catch(err=>{
        alert('post err -> ', err);
    });
};
//post請求
postBtn.onclick = (e)=>{
    //console.log('eee, ', e.target);
    axios.post("/postData").then(res=>{
        console.log('get request result = ', res);
        alert(res);
    }).catch(err=>{
        alert('post err -> ', err);
    });
};

//請求攔截器 中間件
axios.interceptors.request.use((config) => {
    console.log('interceptors.request1');
    return config;
}, (error) => {
    return Promise.reject(error);
});
axios.interceptors.request.use((config) => {
    console.log('interceptors.request2');
    return config;
}, (error) => {
    return Promise.reject(error);
});
//響應(yīng)攔截器 中間件
axios.interceptors.response.use((res) => {
    console.log('interceptors.response1');
    return res;
}, (error) => {
    return Promise.reject(error);
});
axios.interceptors.response.use((res) => {
    console.log('interceptors.response2');
    return res;
}, (error) => {
    return Promise.reject(error);
});

使用多個請求響應(yīng)攔截器的時候矮锈,要注意攔截器寫入的先后順序,當在攔截器中對config做攔截操作處理時睁蕾,會有對接下來的攔截器中config的操作有影響苞笨。如上請求,攔截器的執(zhí)行順序是:

interceptors.request2
interceptors.request1
ajax請求 http://localhost:9000/getData
interceptors.response1
interceptors.response2

githubdemo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末子眶,一起剝皮案震驚了整個濱河市瀑凝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臭杰,老刑警劉巖粤咪,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硅卢,居然都是意外死亡射窒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門将塑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脉顿,“玉大人,你說我怎么就攤上這事点寥“保” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵敢辩,是天一觀的道長蔽莱。 經(jīng)常有香客問我,道長戚长,這世上最難降的妖魔是什么盗冷? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮同廉,結(jié)果婚禮上仪糖,老公的妹妹穿的比我還像新娘。我一直安慰自己迫肖,他們只是感情好锅劝,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟆湖,像睡著了一般故爵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隅津,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天诬垂,我揣著相機與錄音劲室,去河邊找鬼。 笑死剥纷,一個胖子當著我的面吹牛痹籍,可吹牛的內(nèi)容都是我干的呢铆。 我是一名探鬼主播晦鞋,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棺克!你這毒婦竟也來了悠垛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娜谊,失蹤者是張志新(化名)和其女友劉穎确买,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纱皆,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡湾趾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了派草。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀缠。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖近迁,靈堂內(nèi)的尸體忽然破棺而出艺普,到底是詐尸還是另有隱情,我是刑警寧澤鉴竭,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布歧譬,位于F島的核電站,受9級特大地震影響搏存,放射性物質(zhì)發(fā)生泄漏瑰步。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一璧眠、第九天 我趴在偏房一處隱蔽的房頂上張望缩焦。 院中可真熱鬧,春花似錦蛆橡、人聲如沸舌界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻拌。三九已至,卻和暖如春睦焕,著一層夾襖步出監(jiān)牢的瞬間藐握,已是汗流浹背靴拱。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猾普,地道東北人袜炕。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像初家,于是被迫代替她去往敵國和親偎窘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345