Files
users/lib/api-utils.ts

48 lines
1.3 KiB
TypeScript
Raw Normal View History

/**
* API请求函数
* @param url URL
* @param options
* @param retries
* @param retryDelay (ms)
* @returns Promise<Response>
*/
export async function fetchWithRetry(
url: string,
options: RequestInit = {},
retries = 3,
retryDelay = 1000,
): Promise<Response> {
try {
const response = await fetch(url, options)
if (!response.ok && retries > 0) {
console.log(`请求失败,${retryDelay}ms后重试剩余重试次数: ${retries - 1}`)
await new Promise((resolve) => setTimeout(resolve, retryDelay))
return fetchWithRetry(url, options, retries - 1, retryDelay * 2)
}
return response
} catch (error) {
if (retries > 0) {
console.log(`请求出错,${retryDelay}ms后重试剩余重试次数: ${retries - 1}`)
await new Promise((resolve) => setTimeout(resolve, retryDelay))
return fetchWithRetry(url, options, retries - 1, retryDelay * 2)
}
throw error
}
}
/**
* API响应的通用函数
* @param response
* @returns Promise<T>
*/
export async function handleApiResponse<T>(response: Response): Promise<T> {
if (!response.ok) {
const errorData = await response.json().catch(() => ({}))
throw new Error(errorData.message || `请求失败: ${response.status}`)
}
return response.json()
}