React axios拦截 + Promise

import axios from 'axios'
import _ from 'loadsh'

let cancelToken = axios.CancelToken

const cancel = []

const removePending = config => {
    for (let p in cancel) {
        if (cancel[p].u === config.url) {
            cancel[p].f()
        }
    }
}

// 请求拦截器 发送一个请求之前
axios.interceptors.request.use(config => {
    //在一个ajax发送前执行一下取消操作
    removePending(config)
    config.cancelToken = new cancelToken(c => {
        cancel.push({
            f: c,
            u: config.url,
        })
    })
    // 绑定key 值
    // config.data = { ...config.data.data, key: '5d2878270550ac239657ffa54edd96ff' }
  // config.headers = { ...config.headers, key: '5d2878270550ac239657ffa54edd96ff' }
  // config.token = JSON.parse( localStorage.getItem('persist: root')) .token
  // config.token = window.store.getState().login.token
  // config.data = qs.stringify({ ...config.data, token: window.store.getState().login.token })
    return config
}, error => {
    return Promise.reject(error)
})

//添加响应拦截器
axios.interceptors.response.use(response => {
    return response
}, error => { 
 	switch (_.get(error, 'response.status', '')) {
        case 500: 
            console.log('您已经断网了....')
            // window.location.href = '/'
            break;
        default:
            break;
    }
	return Promise.reject(error) 
})



export function requestPost(url, action = {}) {
    return new Promise((resolve, reject) => {
   // const { token } = JSON.parse( localStorage.getItem('persist:root') )
   // store.getState() 拿到所有的state
   // console.log(window.store.getState().login.token, )
   // store.js --- window.store = store
        axios({
            method: 'POST',
            //baseURL: '/api',
            url,
            data: action,
            //headers: {
		    //  key: '5d2878270550ac239657ffa54edd96ff',
	        //},
        })
            .then(res => resolve(res))
            .catch(err => reject(err))
    })
}

export function requestGet(url) {
    return new Promise((resolve, reject) => {
        axios({
            url
        })
            .then(res => resolve(res))
            .catch(err => reject(err))
    })
}

在这里插入图片描述
在这里插入图片描述

现在

import axios from 'axios'
import qs from 'qs'

export function requestPost(url, action = {}) {
    return new Promise((resolve, reject) => {
        axios({
            method: 'POST',
            baseURL: '/api',
            url,
            data: qs.stringify(action),
        })
            .then(res => resolve(res))
            .catch(err => reject(err))
    })
}

export function requestGet(url) {
    return new Promise((resolve, reject) => {
        axios({
            url
        })
            .then(res => resolve(res))
            .catch(err => reject(err))
    })
}

Interceptors // 组件

import React from 'react'
import axios from 'axios'
import _ from 'loadsh'
import { withRouter } from 'react-router-dom'

export default @withRouter
class extends React.PureComponent {
    constructor(props) {
        super(props)
        let cancelToken = axios.CancelToken
        const cancel = []

        const removePending = config => {
            for (let p in cancel) {
                if (cancel[p].u === config.url) {
                    cancel[p].f()
                }
            }
        }

        // 请求拦截器 发送一个请求之前
        axios.interceptors.request.use(config => {
            //在一个ajax发送前执行一下取消操作
            removePending(config)
            config.cancelToken = new cancelToken(c => {
                cancel.push({
                    f: c,
                    u: config.url,
                })
            })
            return config
        }, error => {
            return Promise.reject(error)
        })

        //添加响应拦截器
        axios.interceptors.response.use(response => {
            return response
        }, error => {
		    switch (_.get(error, 'response.status', '')) {
		        case 500: 
		            console.log('您已经断网了....'
		            
		        default:
		            break;
		    }
			return Promise.reject(error) 
        })
    }
    render() {
        return <></>
    }
}

引入

import Interceptors from '@/components/Interceptors'

export default class extends React.PureComponent {
    render() {
        return (
            <BrowserRouter >
                <Interceptors />
                {renderRoutes(route)}
            </BrowserRouter>
        )
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值