迈向高级前端技术分享

并发请求问题方案

2021-06-07  本文已影响0人  斗伽

并发请求问题方案

背景

并发冲突问题, 是日常开发中一个比较常见的问题。

方案

axios实现方案

代码如下


import axios from 'axios';

// 存储pending请求
let pendingRequests = new Map();
// 根据请求参数生成唯一key
let generateKey = function(config) {
    return `${config.url}/${JSON.stringify(config.params)}/${JSON.stringify(config.data)}&request_type=${config.method}`;
}

axios.interceptors.request.use(function(config) {
    // 请求拦截
    let requestKey = generateKey(config);
    if(pendingRequests.has(requestKey)) {
        config.cancelToken = new axios.CancelToken(cancel => {
            cancel(`重复请求被拦截: ${requestKey}`)
        }) 
    } else {
        pendingRequests.set(requestKey, config);
        config.requestKey = requestKey;
    }
    return config;
}, function(err) {
    console.log('request error')
    pendingRequests.clear();
    return Promise.reject(err)
})

axios.interceptors.response.use(function(res) {
    // 响应拦截
    let requestKey = res.config.requestKey;
    pendingRequests.delete(requestKey);
    return Promise.resolve(res);
}, function(err) {
    console.log('response error')
    if(axios.isCancel(err)) {
        return Promise.reject(err);
    }
    let requestKey = err.config.requestKey;
    pendingRequests.delete(requestKey);
    return Promise.reject(err)
})

export default axios;

注意

问题?

建议大家看下,这个场景大家遇到的应该比较多;感谢

上一篇 下一篇

猜你喜欢

热点阅读