Skip to content

Commit

Permalink
feat: methodFactory第二个参数接收函数可以改配置;新增use
Browse files Browse the repository at this point in the history
  • Loading branch information
mengxinssfd committed May 1, 2022
1 parent 6b0e1c8 commit 7a7fd00
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 8 deletions.
7 changes: 3 additions & 4 deletions __test__/AxiosRequestTemplate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,12 @@ describe('AxiosRequestTemplate', () => {
// 不传method时默认为get
const defGet = req.methodFactory(undefined as any);
const res1 = await defGet<{ username: string; id: number }>(
{ url: '/user' },
// 改为post,无效;
// methodFactory的method优先级更高,除了method,url,data其他的axios配置优先级都是这里的高
{ url: '/user', method: 'post' } as any, // method已经从methodFactory剔除出去,不设置为any将会报错
{
statusHandlers: { '200': (_, res) => res },
},
// 改为post,无效;
// methodFactory的method优先级更高,除了method,url,data其他的axios配置优先级都是这里的高
// { method: 'post' } as any,
);
expect(res1).toEqual({
data: { code: 200, data: { username: 'get', id: 1 }, msg: 'success' },
Expand Down
67 changes: 67 additions & 0 deletions __test__/use.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import axios, { AxiosRequestConfig } from 'axios';
import { AxiosRequestTemplate } from '../src';
import { mockAxiosResponse } from './utils';

jest.mock('axios');
const map = new Map<string, Function>();
const mockCreate = (/*config: AxiosRequestConfig*/) => {
// console.log(config);
return function (config) {
const { url, cancelToken } = config;
return new Promise((res, rej) => {
map.set(cancelToken, rej);
if (/^\/use/.test(url)) {
setTimeout(() =>
res(mockAxiosResponse(config, { code: 200, data: config, msg: 'success' })),
);
return;
}
});
};
};
(axios.CancelToken.source as any).mockImplementation(() => {
const token = Math.floor(Math.random() * 0xffffffffff).toString(16);
return {
token,
cancel(msg?: string) {
map.get(token)?.(msg);
},
};
});

(axios as any).create.mockImplementation(mockCreate);
describe('use', () => {
const req = new AxiosRequestTemplate();
test('empty', async () => {
const request = req.use({});
const res = await request<AxiosRequestConfig>({ url: '/use' });
expect(res.data.url).toBe('/use');
expect(res.data.method).toBe('get');
});
test('url', async () => {
const post = req.use({ requestConfig: { url: '/use/', method: 'post' } });
const res = await post<AxiosRequestConfig>({ url: 'test' });
expect(res.data.url).toBe('/use/test');
expect(res.data.method).toBe('post');
const res2 = await post<AxiosRequestConfig>({ url: 'test2' });
expect(res2.data.url).toBe('/use/test2');
expect(res2.data.method).toBe('post');
});
test('methodFactory url', async () => {
const post = req.methodFactory('post', (configs) => {
configs.requestConfig.url = '/use/' + configs.requestConfig.url;
});
const res = await post<AxiosRequestConfig>({ url: 'test' });
expect(res.data.url).toBe('/use/test');
expect(res.data.method).toBe('post');
const res2 = await post<AxiosRequestConfig>({ url: 'test2' });
expect(res2.data.url).toBe('/use/test2');
});
test('data', async () => {
const post = req.use({ requestConfig: { url: '/use', method: 'post', data: { a: 1 } } });
const res = await post<AxiosRequestConfig>({ url: 'test' });
expect(res.data.data).toEqual({ a: 1 });
const res2 = await post<AxiosRequestConfig>({ url: 'test', data: { b: 2 } });
expect(res2.data.data).toEqual({ a: 1, b: 2 });
});
});
20 changes: 16 additions & 4 deletions src/AxiosRequestTemplate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,9 @@ export class AxiosRequestTemplate<CC extends CustomConfig = CustomConfig> {
}
}*/

// 模板方法,请求入口。
request<T = never, RC extends boolean = false>(
requestConfig: Omit<AxiosRequestConfig, 'cancelToken'>,
requestConfig: Omit<AxiosRequestConfig, 'cancelToken' | 'url'> & { url: string },
customConfig?: DynamicCustomConfig<CC, RC>,
): Promise<RC extends true ? AxiosResponse<ResType<T>> : ResType<T>>;
async request(requestConfig: AxiosRequestConfig, customConfig = {} as CC): Promise<any> {
Expand Down Expand Up @@ -369,13 +370,24 @@ export class AxiosRequestTemplate<CC extends CustomConfig = CustomConfig> {
}

// 简单工厂:生成get post delete等method
methodFactory(method: Method) {
methodFactory(method: Method, handler?: (configs: Configs) => void) {
return <T = never, RC extends boolean = false>(
requestConfig: Omit<AxiosRequestConfig, 'cancelToken' | 'url'> & { url: string },
requestConfig: Omit<AxiosRequestConfig, 'cancelToken' | 'url' | 'method'> & { url: string },
customConfig?: DynamicCustomConfig<CC, RC>,
) => this.request<T, RC>({ ...requestConfig, method }, customConfig);
) => {
const configs: Configs = {
requestConfig: requestConfig,
customConfig: customConfig || {},
};
handler?.(configs);
return this.request<T, RC>(
{ ...(configs.requestConfig as any), method },
configs.customConfig as DynamicCustomConfig<CC, RC>,
);
};
}

// 本质上跟methodFactory其实是一样的
use(configs: Partial<Configs<CC>>) {
const { customConfig: custom = {}, requestConfig: request = {} } = configs;
return <T = never, RC extends boolean = false>(
Expand Down

0 comments on commit 7a7fd00

Please sign in to comment.