diff --git a/packages/inula-request/examples/cancelRequest/cancelRequestTest.html b/packages/inula-request/examples/cancelRequest/cancelRequestTest.html index 9b17da87..f9a4ebcd 100644 --- a/packages/inula-request/examples/cancelRequest/cancelRequestTest.html +++ b/packages/inula-request/examples/cancelRequest/cancelRequestTest.html @@ -16,42 +16,33 @@ diff --git a/packages/inula-request/src/cancel/CancelError.ts b/packages/inula-request/src/cancel/CancelError.ts index fbc0d32d..85717094 100644 --- a/packages/inula-request/src/cancel/CancelError.ts +++ b/packages/inula-request/src/cancel/CancelError.ts @@ -17,7 +17,7 @@ import IrError from '../core/IrError'; import { IrRequestConfig } from '../types/interfaces'; class CancelError extends IrError { - constructor(message: string | undefined, config: IrRequestConfig, request?: any) { + constructor(message: string | undefined | null, config: IrRequestConfig, request?: any) { const errorMessage = message || 'canceled'; super(errorMessage, (IrError as any).ERR_CANCELED, config, request); this.name = 'CanceledError'; diff --git a/packages/inula-request/src/cancel/checkCancel.ts b/packages/inula-request/src/cancel/checkCancel.ts index 2fb875fb..8c2bafe7 100644 --- a/packages/inula-request/src/cancel/checkCancel.ts +++ b/packages/inula-request/src/cancel/checkCancel.ts @@ -15,7 +15,7 @@ // 检查是否为用户主动请求取消场景 function checkCancel(input: any): boolean { - return input.cancelFlag || false; + return input.name === 'CanceledError' || input.cancelFlag || false; } export default checkCancel; diff --git a/packages/inula-request/src/core/IrError.ts b/packages/inula-request/src/core/IrError.ts index 4f4f9605..fe9a2fb7 100644 --- a/packages/inula-request/src/core/IrError.ts +++ b/packages/inula-request/src/core/IrError.ts @@ -98,6 +98,7 @@ const errorTypes = [ 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL', + 'ERR_FETCH_FAILED', ]; const descriptors: PropertyDescriptorMap = errorTypes.reduce((acc, code) => { diff --git a/packages/inula-request/src/request/fetchRequest.ts b/packages/inula-request/src/request/fetchRequest.ts index d1b6e9d5..12160bdd 100644 --- a/packages/inula-request/src/request/fetchRequest.ts +++ b/packages/inula-request/src/request/fetchRequest.ts @@ -19,6 +19,7 @@ import { IrRequestConfig, IrResponse, Cancel } from '../types/interfaces'; import { Method, ResponseType } from '../types/types'; import processUploadProgress from './processUploadProgress'; import processDownloadProgress from './processDownloadProgress'; +import CancelError from '../cancel/CancelError'; export const fetchRequest = (config: IrRequestConfig): Promise => { return new Promise((resolve, reject) => { @@ -47,8 +48,9 @@ export const fetchRequest = (config: IrRequestConfig): Promise => { // 处理请求取消 if (cancelToken) { cancelToken.promise.then((reason: Cancel) => { + const cancelError = new CancelError(reason.message, config); controller.abort(); - reject(reason); + reject(cancelError); }); } @@ -166,18 +168,17 @@ export const fetchRequest = (config: IrRequestConfig): Promise => { } }) .catch((error: IrError) => { - if (error.name === 'AbortError') { - reject(error.message); - } else { - reject(error); - } + const irError = new IrError(error.message, 'ERR_FETCH_FAILED', responseData.config, responseData.request, responseData); + reject(irError); }); }) .catch((error: IrError) => { if (error.name === 'AbortError') { - reject(error.message); + const cancelError = new CancelError('request canceled', config); + reject(cancelError); } else { - reject(error); + const irError = new IrError(error.message, 'ERR_FETCH_FAILED'); + reject(irError); } }); } diff --git a/packages/inula-request/src/request/processRequest.ts b/packages/inula-request/src/request/processRequest.ts index f904cdd1..ceeaa5e6 100644 --- a/packages/inula-request/src/request/processRequest.ts +++ b/packages/inula-request/src/request/processRequest.ts @@ -29,10 +29,6 @@ export default function processRequest(config: IrRequestConfig): Promise); @@ -53,6 +49,16 @@ export default function processRequest(config: IrRequestConfig): Promise { + if (config.signal?.aborted) { + error.response = { + data: null, + headers: config.headers, + status: 200, + statusText: 'ok', + config, + }; + } + if (!checkCancel(error)) { if (config.cancelToken) { config.cancelToken.throwIfRequested();