import axios from "axios"; import { ElMessage, ElLoading } from "element-plus"; // 全局状态 const pendingRequests = new Map() let loadingCount = 0 let loadingInstance = null const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 15000, }); // 生成唯一请求标识 const generateReqKey = (config) => { const { method, url, params, data } = config return [method, url, JSON.stringify(params), JSON.stringify(data)].join('&') } // 请求拦截器 service.interceptors.request.use(config => { const requestKey = generateReqKey(config) // 取消重复请求 if (pendingRequests.has(requestKey)) { pendingRequests.get(requestKey)('取消重复请求') } config.cancelToken = new axios.CancelToken(cancel => { pendingRequests.set(requestKey, cancel) }) // 全局Loading控制 if (!config.silentLoading) { loadingCount++ if (loadingCount === 1) { loadingInstance = ElLoading.service({ lock: true, text: "加载中...", background: "rgba(0, 0, 0, 0.7)", }) } } // Token处理 const token = localStorage.getItem("token"); token && (config.headers.Authorization = `Bearer ${token}`) return config }) // 响应拦截器 service.interceptors.response.use( response => { const requestKey = generateReqKey(response.config) pendingRequests.delete(requestKey) // 关闭Loading if (!response.config.silentLoading) { loadingCount = Math.max(0, loadingCount - 1) if (loadingCount === 0 && loadingInstance) { loadingInstance.close() } } // 业务逻辑处理 const res = response.data if (res.code !== 200) { ElMessage.error(res.message || "操作失败") return Promise.reject(new Error(res.message || "Error")) } return res }, error => { // 清理请求记录 if (axios.isCancel(error)) { console.log('请求被取消:', error.message) return Promise.reject(error) } const requestKey = generateReqKey(error.config) pendingRequests.delete(requestKey) // 关闭Loading if (!error.config.silentLoading) { loadingCount = Math.max(0, loadingCount - 1) if (loadingCount === 0 && loadingInstance) { loadingInstance.close() } } // 增强错误处理 if (!error.response) { ElMessage.error("网络连接异常") } else { const status = error.response.status const messageMap = { 400: '请求参数错误', 401: () => { localStorage.removeItem('token') router.replace('/login') return '登录已过期' }, 403: '没有操作权限', 404: '资源不存在', 500: '服务器错误', 502: '网关错误', 503: '服务不可用' } const handler = messageMap[status] || (() => `请求失败 (${status})`) const message = typeof handler === 'function' ? handler() : handler ElMessage.error(message) } return Promise.reject(error) } ) export default service; 这是我封装的请求,我该如何使用
时间: 2025-06-11 18:54:10 浏览: 25
<think>嗯,用户给了一个他们封装的Axios请求代码,想知道该怎么使用。首先,我需要理解这段代码的结构和功能,然后才能解释如何使用它。让我仔细看看代码。
首先,用户导入了axios和Element Plus的ElMessage、ElLoading。然后创建了一个全局状态,包括pendingRequests的Map,用来存储请求,以及loadingCount和loadingInstance来控制加载状态。接着用axios.create创建了一个service实例,设置了baseURL和超时时间。
接下来,generateReqKey函数通过方法、URL、参数和生成请求的唯一标识,用于取消重复请求。请求拦截器中,他们检查是否有重复请求,如果有就取消之前的,并添加新的cancelToken。同时处理了全局Loading,如果请求没有设置silentLoading,就会显示加载中。还有处理了Token,从localStorage中获取并添加到请求头。
响应拦截器里,成功响应时会删除pendingRequests中的记录,关闭Loading,并根据业务代码处理结果,如果code不是200就报错。错误处理部分,如果是取消请求,就忽略,否则根据状态码显示不同的错误信息,比如401跳转登录等。
用户的问题是,如何正确使用这个封装好的service。我需要考虑常见的用法,比如基本的GET、POST请求,如何取消请求,如何静默加载,以及错误处理等。
首先,用户可能需要知道如何导入这个service,然后在组件中使用。比如基本的GET请求,应该用service.get,POST用service.post。同时,他们可能想知道如何传递参数,设置silentLoading选项,以及处理响应和错误。
另外,代码中使用了silentLoading配置项,用户可能需要了解如何在使用时禁用加载动画。还有,取消重复请求的逻辑,用户是否需要知道如何手动取消,或者是否自动处理了。
错误处理部分,用户可能需要注意,当请求失败时,如何捕获错误,比如使用catch或者async/await中的try/catch。同时,401的情况会自动跳转到登录页面,用户可能需要了解这一点,或者是否需要根据项目需求调整。
可能还需要提到如何传递自定义配置,比如设置特定的headers,或者覆盖baseURL等。此外,Token的处理是自动的,用户不需要手动添加,除非有特殊需求。
总结一下,我需要分步骤说明如何使用这个封装好的请求模块,包括基本用法、配置选项、取消请求、错误处理等。可能还需要给出示例代码,展示不同的使用场景,让用户更容易理解。</think>这是一个比较完整的Axios封装实现,我来为您解释使用方式及主要功能特性:
1. **基本请求方式**
```javascript
// GET请求
service.get('/api/user', { params: { id: 123 } })
.then(res => console.log(res))
.catch(err => console.error(err))
// POST请求
service.post('/api/login', { username: 'admin', password: '123456' })
```
2. **高级配置选项**
```javascript
// 静默请求(不显示Loading)
service.get('/api/notifications', { silentLoading: true })
// 自定义请求配置
service({
method: 'PUT',
url: '/api/user/123',
data: { name: 'newName' },
headers: { 'X-Custom-Header': 'value' }
})
```
3. **主要功能特性说明**
* **自动重复请求取消**
- 当发送相同请求(相同method/url/params/data)时,自动取消前一个未完成的请求
- 取消时会触发`取消重复请求`提示(可在控制台查看)
* **全局Loading控制**
- 默认显示全屏Loading动画
- 通过`silentLoading: true`配置可禁用单个请求的Loading
- 智能管理多个并发请求的Loading状态
* **错误处理增强**
```javascript
// 统一错误处理示例
try {
const res = await service.post('/api/data')
} catch (error) {
if (axios.isCancel(error)) {
console.log('请求被主动取消')
} else {
// 这里会接收到拦截器处理后的错误信息
console.error('请求失败:', error.message)
}
}
```
* **自动Token处理**
- 自动从localStorage读取token添加到请求头
- 401状态码自动跳转登录页(需配合Vue Router使用)
* **状态码映射**
- 内置常见HTTP状态码错误提示
- 支持自定义扩展`messageMap`处理逻辑
4. **扩展建议**
- 可在拦截器中添加`请求耗时统计`功能
- 需要自行处理`文件上传进度`时可添加onUploadProgress配置
- 可扩展`缓存策略`配置,对GET请求进行缓存
- 可添加`请求重试`机制,对特定错误进行自动重试
建议在项目中使用时,可以在api目录下按模块拆分请求函数:
```javascript
// api/user.js
export function getUserInfo(id) {
return service.get(`/user/${id}`)
}
export function updateUser(data) {
return service.put('/user', data)
}
```
阅读全文
相关推荐












