需求分析
官方 axios 库实现了 axios.all、axios.spread 等方法,它们的用法如下:
function getUserAccount() {return axios.get('/user/12345');}function getUserPermissions() {return axios.get('/user/12345/permissions');}axios.all([getUserAccount(), getUserPermissions()]).then(axios.spread(function (acct, perms) {// Both requests are now complete}));
以上两个方法完全可由 Promose.all替代
官方 axios 库也通过 axios.Axios 对外暴露了 Axios 类(几乎没有使用场景,为了和官方api一致)
另外对于 axios 实例,官网还提供了 getUri 方法在不发送请求的前提下根据传入的配置返回一个 url,如下:
const fakeConfig = {baseURL: 'https://www.baidu.com/',url: '/user/12345',params: {idClient: 1,idTest: 2,testString: 'thisIsATest'}}console.log(axios.getUri(fakeConfig))// https://www.baidu.com/user/12345?idClient=1&idTest=2&testString=thisIsATest
代码实现
类型声明
export interface Axios {default: AxiosRequestConfiginterceptors: {request: AxiosInterceptorManager<AxiosRequestConfig>response: AxiosInterceptorManager<AxiosResponse>}request<T = any>(config: AxiosRequestConfig): AxiosPromise<T>get<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>head<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>delete<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>options<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>getUri(config: AxiosRequestConfig): string}export interface AxiosStatic extends AxiosInstance {create(config?: AxiosRequestConfig): AxiosInstanceCancelToken: CancelTokenStaticCancel: CancelStaticisCancel: (val: any) => boolean// more 扩展静态方法all<T>(promises: Array<T | Promise<T>>): Promise<T[]>spread<T, R>(callback: (...args: T[]) => R): (arr: T[]) => RAxios: AxiosClassStatic}export interface AxiosClassStatic {new(config: AxiosRequestConfig): Axios}
代码实现
export default class Axios {
// ...
getUri(config: AxiosRequestConfig) {
config = mergeConfig(this.default, config)
return transformUrl(config)
}
}
axios.all = function (promises) {
return Promise.all(promises)
}
axios.spread = function (callback) {
return function (args) {
return callback.apply(null, args)
}
}
axios.Axios = Axios
