Skip to content

Commit f574c5d

Browse files
committed
增加请求重试机制
1 parent 716eab0 commit f574c5d

File tree

1 file changed

+57
-17
lines changed

1 file changed

+57
-17
lines changed

src/api/index.ts

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@ import axios from 'axios'
33
// import qs from 'qs'
44
import { toast } from 'vue-sonner'
55

6+
// 请求重试配置
7+
const MAX_RETRY_COUNT = 3 // 最大重试次数
8+
const RETRY_DELAY = 1000 // 重试延迟时间(毫秒)
9+
10+
// 扩展 AxiosRequestConfig 类型
11+
declare module 'axios' {
12+
export interface AxiosRequestConfig {
13+
retry?: boolean
14+
retryCount?: number
15+
}
16+
}
17+
618
const api = axios.create({
719
baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY) ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
820
timeout: 1000 * 60,
@@ -29,6 +41,28 @@ api.interceptors.request.use(
2941
},
3042
)
3143

44+
// 处理错误信息的函数
45+
function handleError(error: any) {
46+
if (error.status === 401) {
47+
useUserStore().requestLogout()
48+
throw error
49+
}
50+
let message = error.message
51+
if (message === 'Network Error') {
52+
message = '后端网络故障'
53+
}
54+
else if (message.includes('timeout')) {
55+
message = '接口请求超时'
56+
}
57+
else if (message.includes('Request failed with status code')) {
58+
message = `接口${message.substr(message.length - 3)}异常`
59+
}
60+
toast.error('Error', {
61+
description: message,
62+
})
63+
return Promise.reject(error)
64+
}
65+
3266
api.interceptors.response.use(
3367
(response) => {
3468
/**
@@ -50,25 +84,31 @@ api.interceptors.response.use(
5084
}
5185
return Promise.resolve(response.data)
5286
},
53-
(error) => {
54-
if (error.status === 401) {
55-
useUserStore().requestLogout()
56-
throw error
57-
}
58-
let message = error.message
59-
if (message === 'Network Error') {
60-
message = '后端网络故障'
61-
}
62-
else if (message.includes('timeout')) {
63-
message = '接口请求超时'
87+
async (error) => {
88+
// 获取请求配置
89+
const config = error.config
90+
91+
// 如果配置不存在或未启用重试,则直接处理错误
92+
if (!config || !config.retry) {
93+
return handleError(error)
6494
}
65-
else if (message.includes('Request failed with status code')) {
66-
message = `接口${message.substr(message.length - 3)}异常`
95+
96+
// 设置重试次数
97+
config.retryCount = config.retryCount || 0
98+
99+
// 判断是否超过重试次数
100+
if (config.retryCount >= MAX_RETRY_COUNT) {
101+
return handleError(error)
67102
}
68-
toast.error('Error', {
69-
description: message,
70-
})
71-
return Promise.reject(error)
103+
104+
// 重试次数自增
105+
config.retryCount += 1
106+
107+
// 延迟重试
108+
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY))
109+
110+
// 重新发起请求
111+
return api(config)
72112
},
73113
)
74114

0 commit comments

Comments
 (0)