From 796b80370a0ebe0c4bc20ff9cd46a2871c484e58 Mon Sep 17 00:00:00 2001 From: early-autumn <954270063@qq.com> Date: Thu, 23 Apr 2020 10:46:45 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/axios.ts | 32 ++--------------- src/cancel/Cancel.ts | 6 ++-- src/cancel/CancelToken.ts | 21 ++++++----- src/core/Axios.ts | 9 +++-- src/core/InterceptorManager.ts | 20 +++++------ src/core/createError.ts | 8 ++++- src/core/dispatchRequest.ts | 4 +-- src/core/extractData.ts | 6 ---- src/defaults.ts | 2 +- src/index.ts | 2 +- src/types.ts | 54 +++++++++++++--------------- test/core/InterceptorManager.test.ts | 12 +++++-- 12 files changed, 80 insertions(+), 96 deletions(-) delete mode 100644 src/core/extractData.ts diff --git a/src/axios.ts b/src/axios.ts index 221d72c..8d1c9a5 100644 --- a/src/axios.ts +++ b/src/axios.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-15 12:45:18 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-22 16:07:56 + * @LastEditTime: 2020-04-23 10:44:18 */ import { AxiosRequestConfig, Data, AxiosResponse, AxiosBaseInstance, AxiosInstance } from './types'; import Axios from './core/Axios'; @@ -21,16 +21,6 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance { /** * 支持重载的 axios 函数 - * - * @调用方式一 - * - * @param url 调用方式一: 请求配置 - * @param config 调用方式一: 空 - * - * @调用方式二 - * - * @param url 调用方式二: 请求地址 - * @param config 调用方式二: 额外配置 */ function axios( url: AxiosRequestConfig | string, @@ -59,7 +49,7 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance { } /** - * Axios 实例增强 + * Axios 实例拓展 */ const axios = createInstance(defaults); @@ -74,23 +64,7 @@ axios.Axios = Axios; // 添加 CancelToken 类 axios.CancelToken = CancelToken; -// 添加 判断取消请求 方法 +// 添加 检查错误是否来自取消请求 方法 axios.isCancel = isCancel; export default axios; - -// axios -// .extractData<{}>( -// axios.get( -// '/test', -// { -// id: 1, -// }, -// { -// headers: { aaa: 'aaa' }, -// } -// ) -// ) -// .then((data) => { -// console.log(data); -// }); diff --git a/src/cancel/Cancel.ts b/src/cancel/Cancel.ts index 1730a20..8afcf4c 100644 --- a/src/cancel/Cancel.ts +++ b/src/cancel/Cancel.ts @@ -2,18 +2,18 @@ * @Author: early-autumn * @Date: 2020-04-13 21:14:53 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-14 13:41:45 + * @LastEditTime: 2020-04-22 17:38:43 */ import { Cancel } from '../types'; export default class CancelStatic implements Cancel { - message?: string; + public message?: string; constructor(message?: string) { this.message = message; } - toString() { + public toString() { const message = this.message ? `: ${this.message}` : ''; return `Cancel${message}`; diff --git a/src/cancel/CancelToken.ts b/src/cancel/CancelToken.ts index 6adba80..d6ca2d4 100644 --- a/src/cancel/CancelToken.ts +++ b/src/cancel/CancelToken.ts @@ -2,15 +2,18 @@ * @Author: early-autumn * @Date: 2020-04-13 20:00:08 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-15 17:29:07 + * @LastEditTime: 2020-04-22 17:39:44 */ import { CancelToken, CancelAction, CancelExecutor, CancelTokenSource } from '../types'; import Cancel from './Cancel'; export default class CancelTokenStatic implements CancelToken { - reason?: Cancel; + /** + * 取消请求 + */ + private _reason?: Cancel; - listener: Promise; + public listener: Promise; constructor(executor: CancelExecutor) { let action!: CancelAction; @@ -18,22 +21,22 @@ export default class CancelTokenStatic implements CancelToken { this.listener = new Promise((resolve) => { action = (message) => { // 防止重复取消 - if (this.reason) { + if (this._reason) { return; } - this.reason = new Cancel(message); + this._reason = new Cancel(message); - resolve(this.reason); + resolve(this._reason); }; }); executor(action); } - throwIfRequested(): void { - if (this.reason) { - throw this.reason; + public throwIfRequested(): void { + if (this._reason) { + throw this._reason; } } diff --git a/src/core/Axios.ts b/src/core/Axios.ts index 4f7aa16..4f3fc49 100644 --- a/src/core/Axios.ts +++ b/src/core/Axios.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-13 18:00:27 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-22 15:59:22 + * @LastEditTime: 2020-04-23 10:12:56 */ import { Method, Params, Data, Interceptors, AxiosRequestConfig, AxiosResponse, Axios } from '../types'; import buildURL from '../helpers/buildURL'; @@ -21,6 +21,9 @@ export default class AxiosStatic implements Axios { */ public interceptors: Interceptors; + /** + * @param config 自定义默认配置 + */ constructor(config: AxiosRequestConfig = {}) { this.defaults = config; this.interceptors = { @@ -46,7 +49,9 @@ export default class AxiosStatic implements Axios { * @param config Axios 请求配置 */ public request(config: AxiosRequestConfig): Promise> { - let promiseRequest = Promise.resolve(mergeConfig(this.defaults, config)); + const requestConfig = mergeConfig(this.defaults, config); + + let promiseRequest = Promise.resolve(requestConfig); // 执行请求拦截器 this.interceptors.request.forEach(function executor({ resolved, rejected }) { diff --git a/src/core/InterceptorManager.ts b/src/core/InterceptorManager.ts index ad42592..df44568 100644 --- a/src/core/InterceptorManager.ts +++ b/src/core/InterceptorManager.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-15 17:50:50 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-19 13:35:47 + * @LastEditTime: 2020-04-23 09:16:23 */ import { InterceptorResolved, @@ -19,16 +19,16 @@ export default class InterceptorManagerStatic implements InterceptorManager>; + private _interceptors: Record>; constructor() { - this.id = 0; - this.interceptors = {}; + this._id = 0; + this._interceptors = {}; } /** @@ -37,13 +37,13 @@ export default class InterceptorManagerStatic implements InterceptorManager, rejected: InterceptorRejected = (err: any) => Promise.reject(err)) { - this.interceptors[++this.id] = { + public use(resolved: InterceptorResolved, rejected?: InterceptorRejected) { + this._interceptors[++this._id] = { resolved, rejected, }; - return this.id; + return this._id; } /** @@ -52,7 +52,7 @@ export default class InterceptorManagerStatic implements InterceptorManager implements InterceptorManager, reverse?: 'reverse'): void { - let interceptors: Interceptor[] = [...Object.values(this.interceptors)]; + let interceptors: Interceptor[] = Object.values(this._interceptors); if (reverse === 'reverse') { interceptors = interceptors.reverse(); diff --git a/src/core/createError.ts b/src/core/createError.ts index 10b2d3d..c232f63 100644 --- a/src/core/createError.ts +++ b/src/core/createError.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-14 22:23:39 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-20 13:23:04 + * @LastEditTime: 2020-04-23 10:34:18 */ import { AxiosRequestConfig, RequestConfig, AxiosResponse } from '../types'; @@ -30,6 +30,12 @@ class AxiosError extends Error { */ public response?: AxiosResponse; + /** + * @param message 错误信息 + * @param config Axios 请求配置 + * @param request 通用请求配置 + * @param response Axios 响应体 + */ constructor(message: string, config: AxiosRequestConfig, request: RequestConfig, response?: AxiosResponse) { super(message); diff --git a/src/core/dispatchRequest.ts b/src/core/dispatchRequest.ts index e88894a..fd17975 100644 --- a/src/core/dispatchRequest.ts +++ b/src/core/dispatchRequest.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-13 18:01:16 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-21 11:44:53 + * @LastEditTime: 2020-04-23 09:31:00 */ import { AxiosRequestConfig, AxiosResponse } from '../types'; import isCancel from '../cancel/isCancel'; @@ -50,7 +50,7 @@ export default function dispatchRequest(config: AxiosRequestConfig): Promise; +export declare type AnyObject = Record; /** * 请求方法 @@ -44,52 +42,52 @@ export declare interface Headers { /** * 通用配置 */ - common?: Record; + common?: AnyObject; /** * options 请求专用 */ - options?: Record; + options?: AnyObject; /** * get 请求专用 */ - get?: Record; + get?: AnyObject; /** * head 请求专用 */ - head?: Record; + head?: AnyObject; /** * post 请求专用 */ - post?: Record; + post?: AnyObject; /** * put 请求专用 */ - put?: Record; + put?: AnyObject; /** * delete 请求专用 */ - delete?: Record; + delete?: AnyObject; /** * trace 请求专用 */ - trace?: Record; + trace?: AnyObject; /** * connect 请求专用 */ - connect?: Record; + connect?: AnyObject; /** * 自定义配置 */ - [x: string]: Record | string | undefined; + [x: string]: AnyObject | string | undefined; } /** @@ -406,7 +404,7 @@ export declare interface InterceptorResolved { * 拦截器失败的回调函数 */ export declare interface InterceptorRejected { - (error: any): Promise | any; + (error: any): any; } /** @@ -417,10 +415,11 @@ export declare interface Interceptor { * 拦截器成功的回调函数 */ resolved: InterceptorResolved; + /** * 拦截器失败的回调函数 */ - rejected: InterceptorRejected; + rejected?: InterceptorRejected; } /** @@ -575,7 +574,7 @@ export declare interface Axios { * Axios 类接口 */ export declare interface AxiosConstructor { - new (config: AxiosRequestConfig): Axios; + new (config?: AxiosRequestConfig): Axios; } /** @@ -643,11 +642,6 @@ export declare interface CancelExecutor { * 取消令牌 */ export declare interface CancelToken { - /** - * 取消请求 - */ - reason?: Cancel; - /** * 取消时被触发 */ @@ -695,12 +689,14 @@ export declare interface CancelTokenConstructor { } /** - * Axios 实例基础增强 + * Axios 实例基础拓展 * * * 支持两种函数调用方式 */ export declare interface AxiosBaseInstance extends Axios { /** + * 发送 HTTP 请求 + * * 调用方式一 * * @param config 请求配置 @@ -708,6 +704,8 @@ export declare interface AxiosBaseInstance extends Axios { (config: AxiosRequestConfig): Promise>; /** + * 发送 HTTP 请求 + * * 调用方式二 * * @param url 请求地址 @@ -717,7 +715,7 @@ export declare interface AxiosBaseInstance extends Axios { } /** - * Axios 实例增强 + * Axios 实例拓展 * * * 支持两种函数调用方式 * @@ -725,9 +723,9 @@ export declare interface AxiosBaseInstance extends Axios { */ export declare interface AxiosInstance extends AxiosBaseInstance { /** - * 创建 Axios 实例基础增强 + * 创建 Axios 实例基础拓展 * - * @param config 全局配置 + * @param config 自定义默认配置 */ create(config?: AxiosRequestConfig): AxiosBaseInstance; @@ -742,11 +740,9 @@ export declare interface AxiosInstance extends AxiosBaseInstance { CancelToken: CancelTokenConstructor; /** - * 检查一个错误是不是取消错误 + * 检查错误是否来自取消请求 * * @param value 判断的值 */ isCancel: (value: any) => boolean; - - // extractData: (response: Promise>) => Promise; } diff --git a/test/core/InterceptorManager.test.ts b/test/core/InterceptorManager.test.ts index d43cf31..923396d 100644 --- a/test/core/InterceptorManager.test.ts +++ b/test/core/InterceptorManager.test.ts @@ -2,7 +2,7 @@ * @Author: early-autumn * @Date: 2020-04-20 15:40:44 * @LastEditors: early-autumn - * @LastEditTime: 2020-04-20 22:05:48 + * @LastEditTime: 2020-04-23 09:29:17 */ import InterceptorManager from '../../src/core/InterceptorManager'; @@ -54,8 +54,14 @@ describe('测试 src/core/InterceptorManager.ts', () => { it('异常', () => { const interceptor = new InterceptorManager(); - interceptor.use(() => undefined); + interceptor.use( + () => undefined, + (error: any) => { + expect(error).toBe('error'); + return Promise.reject(error); + } + ); - interceptor.forEach(({ rejected }) => rejected('error')); + interceptor.forEach(({ rejected }) => rejected?.('error')); }); });