zhou zhou
11 小时以前 7c2bffa1a495cc4a3a263f654c08c231009c5c4e
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { ElMessage } from 'element-plus'
import { $t } from '@/locales'
 
const DEFAULT_REQUEST_GUARD_TIMEOUT = 8e3
const DEFAULT_REQUEST_TIMEOUT_MESSAGE = () => $t('message.requestTimeoutStopped')
 
function withRequestGuard(task, fallbackValue, options = {}) {
  const { timeoutMs = DEFAULT_REQUEST_GUARD_TIMEOUT, onFallback } = options
 
  return new Promise((resolve) => {
    let settled = false
 
    const finish = (value, reason, error) => {
      if (settled) return
      settled = true
      clearTimeout(timer)
      if (typeof onFallback === 'function' && reason) {
        onFallback(reason, error)
      }
      resolve(value)
    }
 
    const timer = setTimeout(() => finish(fallbackValue, 'timeout'), timeoutMs)
 
    Promise.resolve(task).then(
      (value) => finish(value),
      (error) => finish(fallbackValue, 'error', error)
    )
  })
}
 
function guardRequestWithMessage(task, fallbackValue, options = {}) {
  const {
    timeoutMs = DEFAULT_REQUEST_GUARD_TIMEOUT,
    timeoutMessage = DEFAULT_REQUEST_TIMEOUT_MESSAGE(),
    errorMessage,
    resolveErrorMessage
  } = options
 
  return withRequestGuard(task, fallbackValue, {
    timeoutMs,
    onFallback: (reason, error) => {
      if (reason === 'timeout') {
        if (timeoutMessage) {
          ElMessage.warning(timeoutMessage)
        }
        return
      }
 
      const resolvedMessage =
        typeof resolveErrorMessage === 'function'
          ? resolveErrorMessage(error)
          : errorMessage || error?.message
 
      if (resolvedMessage) {
        ElMessage.error(resolvedMessage)
      }
    }
  })
}
 
export {
  DEFAULT_REQUEST_GUARD_TIMEOUT,
  DEFAULT_REQUEST_TIMEOUT_MESSAGE,
  guardRequestWithMessage,
  withRequestGuard
}