中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現二次封裝axios并根據實現多個請求多次攔截

發布時間:2020-07-09 11:42:59 來源:億速云 閱讀:1000 作者:Leah 欄目:web開發

本篇文章為大家展示了如何實現二次封裝axios并根據實現多個請求多次攔截,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1、新建 axiosTool.js 文件,設置請求攔截和處理的邏輯

import Vue from 'vue'
import axios from 'axios'
//取消請求
let CancelToken = axios.CancelToken
//設置默認請求頭,如果不需要可以取消這一步
axios.defaults.headers = {
    'X-Requested-With': 'XMLHttpRequest'
}
// 請求超時的時間限制
axios.defaults.timeout = 20000
// 開始設置請求 發起的攔截處理
// config 代表發起請求的參數的實體
axios.interceptors.request.use(config => {
    // 得到參數中的 requestName 字段,用于決定下次發起請求,取消對應的 相同字段的請求
    // 如果沒有 requestName 就默認添加一個 不同的時間戳
    let requestName
    if(config.method === 'post'){
        if(config.data && config.data.requestName){
            requestName = config.data.requestName
        }else{
            requestName = new Date().getTime()
        }
    }else{
        if(config.params && config.params.requestName){
            requestName = config.params.requestName
        }else{
            requestName = new Date().getTime()
        }
    }
    // 判斷,如果這里拿到的參數中的 requestName 在上一次請求中已經存在,就取消上一次的請求
    if (requestName) {
        if (axios[requestName] && axios[requestName].cancel) {
            axios[requestName].cancel()
        }
        config.cancelToken = new CancelToken(c => {
            axios[requestName] = {}
            axios[requestName].cancel = c
        })
    }
    return config
}, error => {
    return Promise.reject(error)
})

// 請求到結果的攔截處理
axios.interceptors.response.use(config => {
    // 返回請求正確的結果
    return config
}, error => {
    // 錯誤的請求結果處理,這里的代碼根據后臺的狀態碼來決定錯誤的輸出信息
    if (error && error.response) {
        switch (error.response.status) {
            case 400:
                error.message = '錯誤請求'
                break
            case 401:
                error.message = '未授權,請重新登錄'
                break
            case 403:
                error.message = '拒絕訪問'
                break
            case 404:
                error.message = '請求錯誤,未找到該資源'
                break
            case 405:
                error.message = '請求方法未允許'
                break
            case 408:
                error.message = '請求超時'
                break
            case 500:
                error.message = '服務器端出錯'
                break
            case 501:
                error.message = '網絡未實現'
                break
            case 502:
                error.message = '網絡錯誤'
                break
            case 503:
                error.message = '服務不可用'
                break
            case 504:
                error.message = '網絡超時'
                break
            case 505:
                error.message = 'http版本不支持該請求'
                break
            default:
                error.message = `連接錯誤${error.response.status}`
        }
    } else {
        error.message = "連接到服務器失敗"
    }
    return Promise.reject(error.message)
})
// 將axios 的 post 方法,綁定到 vue 實例上面的 $post
Vue.prototype.$post = function (url, params) {
    return new Promise((resolve, reject) => {
        axios.post(url, params)
            .then(res => {
                resolve(res)
            }).catch(err => {
            reject(err)
        })
    })
}
// 將axios 的 get 方法,綁定到 vue 實例上面的 $get
Vue.prototype.$get = function (url, params) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        }).then(res => {
            resolve(res) // 返回請求成功的數據 data
        }).catch(err => {
            reject(err)
        })
    })
}
// 請求示例
// requestName 為多余的參數 作為請求的標識,下次發起相同的請求,就會自動取消上一次還沒有結束的請求
// 比如正常的請求參數只有一個 name: '123',但是這里我們需要額外再加上一個 requestName
/**
    this.$post(url, { name: '123', requestName: 'post_1' })
        .then(res => {
            console.log(`請求成功:${res}`)
        })
 */

export default axios

2. 再 main.js 中引入該文件

import { axios } from './static/js/axiosTool'

3. 在組件中直接使用即可

this.$post(this.url2, {
    name: "王",
    docType: "pson",
    requestName: 'name02'
}).then(res => {
    console.log(res)
})

this.$get(this.url, {
    name: "李",
    requestName: 'name01'
}).then(res => {
    console.log(res)
})

上述內容就是如何實現二次封裝axios并根據實現多個請求多次攔截,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平邑县| 五家渠市| 河间市| 沈丘县| 金湖县| 合肥市| 嘉善县| 岗巴县| 文登市| 库车县| 罗田县| 新竹市| 滨州市| 布拖县| 姚安县| 深泽县| 天台县| 三台县| 陕西省| 天祝| 景德镇市| 石家庄市| 湖口县| 广丰县| 吉水县| 忻城县| 巫溪县| 泌阳县| 乌兰浩特市| 虎林市| 松桃| 勐海县| 桃江县| 清水河县| 奉节县| 讷河市| 贡觉县| 辉县市| 会东县| 岳普湖县| 阳江市|