From bbabd5e8a5f2c21c0cd50eca8a11d518e57cb99a Mon Sep 17 00:00:00 2001 From: 13659257719 <819781841@qq.com> Date: Tue, 5 Dec 2023 19:57:54 +0800 Subject: [PATCH] =?UTF-8?q?[inula-request]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=AF=B7=E6=B1=82=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inula-request/src/request/fetchRequest.ts | 10 ++++++++-- .../src/request/processUploadProgress.ts | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/inula-request/src/request/fetchRequest.ts b/packages/inula-request/src/request/fetchRequest.ts index 12160bdd..b2f598ee 100644 --- a/packages/inula-request/src/request/fetchRequest.ts +++ b/packages/inula-request/src/request/fetchRequest.ts @@ -168,8 +168,14 @@ export const fetchRequest = (config: IrRequestConfig): Promise => { } }) .catch((error: IrError) => { - const irError = new IrError(error.message, 'ERR_FETCH_FAILED', responseData.config, responseData.request, responseData); - reject(irError); + // fetch 在取消请求的极限场景会抛出 Failed to fetch 的 error,此时将其转为取消 error + if (signal?.aborted) { + const irError = new CancelError('request canceled', config); + reject(irError); + } else { + const irError = new IrError(error.message, 'ERR_FETCH_FAILED', responseData.config, responseData.request, responseData); + reject(irError); + } }); }) .catch((error: IrError) => { diff --git a/packages/inula-request/src/request/processUploadProgress.ts b/packages/inula-request/src/request/processUploadProgress.ts index 0ee4bea9..4e1586a4 100644 --- a/packages/inula-request/src/request/processUploadProgress.ts +++ b/packages/inula-request/src/request/processUploadProgress.ts @@ -15,6 +15,7 @@ import { IrProgressEvent, IrRequestConfig, IrResponse } from '../types/interfaces'; import IrError from '../core/IrError'; +import CancelError from '../cancel/CancelError'; function processUploadProgress( onUploadProgress: (progressEvent: IrProgressEvent) => void | null, @@ -95,7 +96,7 @@ function processUploadProgress( xhr.abort(); const errorMsg = config.timeoutErrorMessage ?? `timeout of ${config.timeout}ms exceeded`; throw new IrError(errorMsg, '', config, xhr, undefined); - } + }; } for (const header in config.headers) { @@ -106,6 +107,21 @@ function processUploadProgress( xhr.setRequestHeader(header, config.headers[header]); } } + + if (config.signal) { + const onCanceled = () => { + const irError = new CancelError('request canceled', config); + reject(irError); + xhr.abort(); + }; + + if (config.signal.aborted) { + onCanceled(); + } else { + config.signal.addEventListener('abort', onCanceled); + } + } + xhr.send(data); };