import { ElMessage } from 'element-plus'
|
|
const DEFAULT_REQUEST_GUARD_TIMEOUT = 8e3
|
const DEFAULT_REQUEST_TIMEOUT_MESSAGE = '请求超时,已停止等待'
|
|
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
|
}
|