From 40f1f77d465c77c640376cea207488e200beba1e Mon Sep 17 00:00:00 2001 From: zjx0905 <954270063@qq.com> Date: Fri, 7 Apr 2023 13:50:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20request=20?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/Axios.ts | 4 +-- src/core/dispatchRequest.ts | 63 +++++++++++++++++++++---------------- src/core/generateType.ts | 9 +++--- src/core/request.ts | 1 - test/core/request.test.ts | 11 ++----- 5 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/core/Axios.ts b/src/core/Axios.ts index 136f6cd..35038b2 100644 --- a/src/core/Axios.ts +++ b/src/core/Axios.ts @@ -139,9 +139,9 @@ export interface AxiosRequestConfig */ transformResponse?: AxiosTransformer | AxiosTransformer[]; /** - * 异常梳处理 + * 异常处理 */ - errorHandler?: (error: unknown) => Promise; + errorHandler?: (error: unknown) => Promise; /** * 监听上传进度 */ diff --git a/src/core/dispatchRequest.ts b/src/core/dispatchRequest.ts index b5228f8..89b5912 100644 --- a/src/core/dispatchRequest.ts +++ b/src/core/dispatchRequest.ts @@ -1,6 +1,7 @@ +import { isFunction } from '../helpers/isTypes'; import { isCancel, isCancelToken } from './cancel'; import { flattenHeaders } from './flattenHeaders'; -import { transformData } from './transformData'; +import { AxiosTransformer, transformData } from './transformData'; import { request } from './request'; import { AxiosRequestConfig, AxiosResponse } from './Axios'; import { transformURL } from './transformURL'; @@ -17,37 +18,45 @@ export default function dispatchRequest( config: AxiosRequestConfig, ): Promise { throwIfCancellationRequested(config); + const { transformRequest, transformResponse } = config; - config.method = config.method ?? 'get'; config.url = transformURL(config); + config.method = config.method ?? 'get'; config.headers = flattenHeaders(config); - config.data = transformData( - config.data, - config.headers, - config.transformRequest, - ); - function transformer(response: AxiosResponse) { - response.data = transformData( - response.data as AnyObject, - response.headers, - config.transformResponse, + transform(config, transformRequest); + + function onSuccess(response: AxiosResponse) { + throwIfCancellationRequested(config); + transform(response, transformResponse); + return response; + } + + function onError(reason: unknown) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + if (isAxiosError(reason)) { + transform(reason.response as AxiosResponse, transformResponse); + } + } + + if (isFunction(config.errorHandler)) { + return config.errorHandler(reason); + } + + return Promise.reject(reason); + } + + function transform( + target: AxiosRequestConfig | AxiosResponse, + transformer?: AxiosTransformer | AxiosTransformer[], + ) { + target.data = transformData( + target.data as AnyObject, + target.headers, + transformer, ) as TData; } - return request(config) - .then((response: AxiosResponse) => { - throwIfCancellationRequested(config); - transformer(response); - return response; - }) - .catch((reason: unknown) => { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - if (isAxiosError(reason)) { - transformer(reason.response as AxiosResponse); - } - } - throw config.errorHandler?.(reason) ?? reason; - }); + return request(config).then(onSuccess).catch(onError); } diff --git a/src/core/generateType.ts b/src/core/generateType.ts index 64f12ec..a2a5f1a 100644 --- a/src/core/generateType.ts +++ b/src/core/generateType.ts @@ -1,16 +1,17 @@ import { AxiosAdapterRequestType } from '../adapter'; import { AxiosRequestConfig } from './Axios'; +const postRE = /^POST$/i; +const getRE = /^GET$/i; + export function generateType( config: AxiosRequestConfig, ): AxiosAdapterRequestType { let requestType: AxiosAdapterRequestType = 'request'; - const method = config.method!.toUpperCase(); - if (config.upload && method === 'POST') { + if (config.upload && postRE.test(config.method!)) { requestType = 'upload'; - } - if (config.download && method === 'GET') { + } else if (config.download && getRE.test(config.method!)) { requestType = 'download'; } diff --git a/src/core/request.ts b/src/core/request.ts index 3484a91..c6d6d7c 100644 --- a/src/core/request.ts +++ b/src/core/request.ts @@ -44,7 +44,6 @@ export function request( return new Promise((resolve, reject) => { assert(isFunction(config.adapter), 'adapter 不是一个 function'); assert(isString(config.url), 'url 不是一个 string'); - assert(isString(config.method), 'method 不是一个 string'); const adapterConfig: AxiosAdapterRequestConfig = { ...config, diff --git a/test/core/request.test.ts b/test/core/request.test.ts index 8f1f9be..0798355 100644 --- a/test/core/request.test.ts +++ b/test/core/request.test.ts @@ -7,20 +7,15 @@ import { } from 'scripts/test.utils'; describe('src/core/request.ts', () => { - test('应该抛出异常', async () => { - await expect(request({})).rejects.toThrowErrorMatchingInlineSnapshot( + test('应该抛出异常', () => { + expect(request({})).rejects.toThrowErrorMatchingInlineSnapshot( '"[axios-miniprogram]: adapter 不是一个 function"', ); - await expect( + expect( request({ adapter: mockAdapter() }), ).rejects.toThrowErrorMatchingInlineSnapshot( '"[axios-miniprogram]: url 不是一个 string"', ); - await expect( - request({ adapter: mockAdapter(), url: 'test' }), - ).rejects.toThrowErrorMatchingInlineSnapshot( - '"[axios-miniprogram]: method 不是一个 string"', - ); }); test('应该能够取到数据', async () => {