(ms: number, token?: AbortToken)
| 1003 | |
| 1004 | const sleep = (ms: number, token?: AbortToken): Promise<void> => { |
| 1005 | return new Promise<void>((resolve, reject) => { |
| 1006 | token?.throwIfAborted(); |
| 1007 | let settled = false; |
| 1008 | const cleanup = () => { |
| 1009 | if (!token?.signal) return; |
| 1010 | token.signal.removeEventListener("abort", abortHandler); |
| 1011 | }; |
| 1012 | const timeoutId = setTimeout(() => { |
| 1013 | if (settled) return; |
| 1014 | settled = true; |
| 1015 | cleanup(); |
| 1016 | resolve(); |
| 1017 | }, ms); |
| 1018 | const abortHandler = () => { |
| 1019 | if (settled) return; |
| 1020 | settled = true; |
| 1021 | clearTimeout(timeoutId); |
| 1022 | cleanup(); |
| 1023 | reject(new UserError(token?.reason?.toString() || "操作已取消")); |
| 1024 | }; |
| 1025 | if (token?.signal) |
| 1026 | token.signal.addEventListener("abort", abortHandler, { once: true }); |
| 1027 | }); |
| 1028 | }; |
| 1029 | |
| 1030 | const retryWithFixedDelay = async <T>( |
| 1031 | operation: () => Promise<T>, |
| 1032 | maxRetries: number = 2, |
no test coverage detected