| 2418 | |
| 2419 | private combine( |
| 2420 | timeoutController: AbortController, |
| 2421 | externalToken?: AbortToken, |
| 2422 | ): AbortToken { |
| 2423 | const controller = new AbortController(); |
| 2424 | |
| 2425 | if (timeoutController.signal.aborted) |
| 2426 | controller.abort(timeoutController.signal.reason); |
| 2427 | else |
| 2428 | timeoutController.signal.addEventListener( |
| 2429 | "abort", |
| 2430 | () => controller.abort(timeoutController.signal.reason), |
| 2431 | { |
| 2432 | once: true, |
| 2433 | }, |
| 2434 | ); |
| 2435 | |
| 2436 | if (externalToken) { |
| 2437 | if (externalToken.aborted) controller.abort(externalToken.reason); |
| 2438 | else |
| 2439 | externalToken.signal.addEventListener( |
| 2440 | "abort", |
| 2441 | () => controller.abort(externalToken.reason), |
| 2442 | { |
| 2443 | once: true, |
| 2444 | }, |
| 2445 | ); |
| 2446 | } |
| 2447 | |
| 2448 | return { |
| 2449 | get aborted() { |
| 2450 | return controller.signal.aborted; |
| 2451 | }, |
| 2452 | get reason() { |
| 2453 | return controller.signal.reason?.toString(); |
| 2454 | }, |
| 2455 | get signal() { |
| 2456 | return controller.signal; |
| 2457 | }, |
| 2458 | abort(reason?: string) { |
| 2459 | controller.abort(reason); |
| 2460 | }, |
| 2461 | throwIfAborted() { |
| 2462 | if (controller.signal.aborted) { |
| 2463 | throw new UserError( |
| 2464 | controller.signal.reason?.toString() || "操作已取消", |
| 2465 | ); |
| 2466 | } |
| 2467 | }, |
| 2468 | }; |
| 2469 | } |
| 2470 | } |
| 2471 | |
| 2472 | class HttpClient { |
| 2473 | private axiosInstance: AxiosInstance; |