import { InternalAxiosRequestConfig, AxiosPromise, AxiosError } from 'axios'; import { buildFullPath, deepCopy } from '../utils'; import { canceller, cancellerCalled } from '../canceller' declare const wx: any; export default function wxAdapter(config: InternalAxiosRequestConfig): AxiosPromise { // adapter接受的config要完全符合axios的配置规范,然后在这里针对不同的引擎做个性化修改 return new Promise((resolve, reject) => { let requestConfig = {} as any; let isAborted = false let requestTask: any = null const { headers, data, params, url, timeout, method, ...rest } = config; const requestHeader = deepCopy(headers); delete requestHeader.Referer; // 小程序文档,header中不能有Referer requestConfig.header = requestHeader; const requestData = data || params; // wx环境,不论get还是post,参数传递的属性名均为data requestConfig.data = deepCopy(requestData); requestConfig.url = buildFullPath(config.baseURL || '', config.url || ''); requestConfig.timeout = config.timeout; requestConfig.method = config?.method?.toUpperCase(); requestConfig = { ...requestConfig, ...rest }; requestConfig.success = (res) => { let response = {} as any; const { data: resData, statusCode, header, ...restRes } = res; response.data = resData; response.status = statusCode; response.headers = header; response.config = config; response = { ...response, ...restRes }; const { validateStatus } = response.config; if (!response.status || !validateStatus || validateStatus(response.status)) { resolve(response); } else { const errMsg = `Request failed with status code ${response.status}` reject(new AxiosError(errMsg, '', requestConfig, requestTask, response)); } }; requestConfig.fail = (err) => { if (isAborted) { reject(new AxiosError(err.errMsg, AxiosError.ERR_CANCELED, requestConfig, requestTask)) } reject(new AxiosError(err.errMsg, err.errno, requestConfig, requestTask)); }; // 判断是否已经调用了取消函数 if (cancellerCalled.includes(requestConfig.cancelKey)) { // 已经调用过取消函数了,直接抛出错误即可 reject(new AxiosError('请求在发出之前被主动取消!', AxiosError.ERR_CANCELED, requestConfig, requestTask)) // 删除记录 cancellerCalled.splice(cancellerCalled.indexOf(requestConfig.cancelKey), 1) return } requestTask = wx.request(requestConfig); // 设置了cancelKey,但是环境不支持AbortController if ('undefined' === typeof requestConfig.signal && requestConfig.cancelKey) { canceller[requestConfig.cancelKey] = () => { isAborted = true requestTask.abort.call(requestTask) Reflect.deleteProperty(canceller, requestConfig.cancelKey) } } }); }