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 }