| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import { hideLoading, showLoading } from '../../utils/message/index'
- import { getLoginCode, loginid, setLoginCode, xtoken } from '../utils'
- import { Method, HttpConfig, HttpRequest, HttpResponse, ResultCode } from './interface'
- import { addPending, removePending } from './pending/index'
- /**
- * 根据url参数生成唯一key
- */
- function getRequestKey<T>(config: HttpConfig<T>) {
- const { method, url, data } = config
- const requestKey: string[] = [method, url]
- if (data) {
- // 参数转换查询字符串
- const queryString = Object.entries(data).reduce((res, property, index) => {
- const str = property[0] + '=' + property[1]
- return index > 0 ? res + '&' + str : str
- }, '')
- requestKey.push(queryString)
- }
- return requestKey.join('&')
- }
- function logout() {
- /// 获取上次登录账号
- const username = getLoginCode()
- /// 清楚所有的缓存数据
- wx.clearStorage()
- /// 设置登录账号
- setLoginCode(username)
- /// loding....
- showLoading(()=>{
- /// 登出
- setTimeout(function () {
- hideLoading(()=>{
- // on confirm
- wx.reLaunch({ url: '/pages/login/index' })
- })
- }, 3000)
- }, '登出中....')
- }
- /**
- * Http请求
- */
- function httpMiddleware<T>(config: HttpConfig<T>) {
- const { url, method, enableAuthorization, data } = config
- // 过滤字符串前面所有 '/' 字符
- const requestUrl = url.replace(/^\/+/, '')
- // 请求头
- const header = {
- 'Authorization': xtoken(),
- 'Group': 5,
- 'LoginID': loginid(),
- 'x-token': xtoken()
- }
- return new Promise((resolve, reject) => {
- const requestKey = getRequestKey(config)
- // 在请求开始前,对之前的请求做检查取消操作
- removePending(requestKey)
- const requestTask = wx.request({
- url: requestUrl,
- method,
- header: enableAuthorization ? header : {},
- data: data ?? {},
- success: (res) => {
- resolve(res.data)
- },
- fail: (err) => {
- reject('请求异常,请稍后再试'+err)
- },
- complete: () => {
- // 在请求结束后,移除本次请求
- removePending(requestKey)
- }
- })
- // 将当前请求添加到列表中
- addPending(requestKey, requestTask)
- })
- }
- /**
- * Http请求结果
- */
- export async function httpRequest<T extends { req?: unknown, rsp?: unknown }>(url: string, method: Method, params: HttpRequest<T>): Promise<void> {
- const { data, enableAuthorization, success, fail, complete } = params;
- const config: HttpConfig<T['req']> = {
- url,
- method,
- enableAuthorization: enableAuthorization ?? true,
- data,
- }
-
- await httpMiddleware(config).then((res) => {
- const data = res as HttpResponse<T['rsp']>
- switch (data.code) {
- case ResultCode.InvalidToken:
- // 退出登录
- // logout();
- return Promise.reject('令牌无效')
- case ResultCode.UnvalidToken:
- logout();
- return Promise.reject('异地登录,请重新登录')
- case ResultCode.Success:
- success && success(data)
- return Promise.resolve()
- case ResultCode.Code:
- success && success(data)
- return Promise.resolve()
- default:
- return Promise.reject(data.msg)
- }
- }).catch((err) => {
- fail && fail(err);
- return Promise.reject(err);
- }).finally(() => {
- complete && complete()
- })
- }
|