Are you an LLM? You can read better optimized documentation at /vite-press/frontend/code/fetchWithTimeout.md for this page in Markdown format
封装 fetch 支持 timeout
ts
export const fetchWithTimeout = async <T>(
url: string,
options: RequestInit = {},
timeout: number = 1000,
type: 'json' | 'text' | 'blob' | 'arrayBuffer' | 'bytes' | 'formData' = 'json',
): Promise<T | undefined> => {
const c = new AbortController()
const timer = setTimeout(() => c.abort(), timeout)
try {
const res = await fetch(url, { ...options, signal: c.signal })
let data: unknown
switch (type) {
case 'json':
data = await res.json()
break
case 'text':
data = await res.text()
break
case 'blob':
data = await res.blob()
break
case 'arrayBuffer':
data = await res.arrayBuffer()
break
case 'formData':
data = await res.formData()
break
case 'bytes':
data = await res.bytes()
break
}
return data as T
} catch (e) {
return void 0
} finally {
clearTimeout(timer)
}
}
console.log(await fetchWithTimeout('https://example.com', {}, 5000, 'text'))1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44