axios-miniprogram/src/core/dispatchRequest.ts

93 lines
2.6 KiB
TypeScript
Raw Normal View History

2020-04-14 23:45:21 +08:00
/*
* @Author: early-autumn
2020-04-17 00:18:59 +08:00
* @Date: 2020-04-13 18:01:16
2020-04-14 23:45:21 +08:00
* @LastEditors: early-autumn
2020-04-17 00:18:59 +08:00
* @LastEditTime: 2020-04-17 00:07:35
2020-04-14 23:45:21 +08:00
*/
2020-04-17 00:18:59 +08:00
import { MethodType, ResponseData, AxiosRequestConfig, AxiosResponse } from '../types';
import { merge } from '../helper/utils';
import transformURL from '../helper/transformURL';
import transformData from '../helper/transformData';
import createError from './createError';
2020-04-14 23:45:21 +08:00
import request from './request';
2020-04-16 00:23:24 +08:00
/**
2020-04-17 00:18:59 +08:00
*
2020-04-16 00:23:24 +08:00
*
* @param config
*/
2020-04-17 00:18:59 +08:00
export default function dispatchRequest(config: AxiosRequestConfig): Promise<AxiosResponse> {
return new Promise((resolve, reject) => {
const { headers = {}, cancelToken, ...options } = config;
2020-04-16 00:23:24 +08:00
2020-04-17 00:18:59 +08:00
// 把方法转成全大写
config.method = (config.method?.toUpperCase() ?? 'GET') as MethodType;
2020-04-16 00:23:24 +08:00
2020-04-17 00:18:59 +08:00
// 合并 headers
config.headers = merge(
headers.common ?? {},
(headers[(config.method as string).toLowerCase()] ?? {}) as AnyObject,
headers
);
2020-04-16 00:23:24 +08:00
2020-04-17 00:18:59 +08:00
// 转换请求数据
config.data = transformData(config.data, config.headers, config.transformRequest);
/**
*
*
* @param param0
* @param response
*/
function catchError({ errMsg }: { errMsg: string }, response?: AxiosResponse): void {
reject(createError(errMsg, config, response));
}
/**
*
*
* @param result
*/
function checkStatusCode(result: WechatMiniprogram.RequestSuccessCallbackResult): void {
const { header: headers, ...rest } = result;
const response = { ...rest, headers, config };
const { statusCode, errMsg } = response;
// 成功
if (config.validateStatus === undefined || config.validateStatus(statusCode)) {
// 转换响应数据
response.data = transformData(response.data, response.headers, config.transformResponse) as ResponseData;
resolve(response);
}
// 失败
else {
// `Request failed with status code ${statusCode}`
catchError({ errMsg }, response);
}
}
// 发送请求
const requestTask = request({
...options,
url: transformURL(config),
method: config.method,
header: config.headers,
data: config.data,
success: checkStatusCode,
fail: catchError,
complete: undefined,
});
2020-04-14 23:45:21 +08:00
2020-04-17 00:18:59 +08:00
// 如果存在取消令牌
// 则调用取消令牌里的 listener 监听用户的取消操作
if (cancelToken !== undefined) {
cancelToken.listener.then(function onCanceled(reason): void {
requestTask.abort();
reject(reason);
});
}
});
2020-04-14 23:45:21 +08:00
}