index.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { loginid, xtoken } from '../utils'
  2. import { Method, HttpConfig, HttpRequest, HttpResponse, ResultCode } from './interface'
  3. import { addPending, removePending } from './pending/index'
  4. /**
  5. * 根据url参数生成唯一key
  6. */
  7. function getRequestKey<T>(config: HttpConfig<T>) {
  8. const { method, url, data } = config
  9. const requestKey: string[] = [method, url]
  10. if (data) {
  11. // 参数转换查询字符串
  12. const queryString = Object.entries(data).reduce((res, property, index) => {
  13. const str = property[0] + '=' + property[1]
  14. return index > 0 ? res + '&' + str : str
  15. }, '')
  16. requestKey.push(queryString)
  17. }
  18. return requestKey.join('&')
  19. }
  20. /**
  21. * Http请求
  22. */
  23. function httpMiddleware<T>(config: HttpConfig<T>) {
  24. const { url, method, enableAuthorization, data } = config
  25. // 过滤字符串前面所有 '/' 字符
  26. const requestUrl = url.replace(/^\/+/, '')
  27. // 请求头
  28. const header = {
  29. 'Authorization': xtoken(),
  30. 'Group': 5,
  31. 'LoginID': loginid(),
  32. 'x-token': xtoken()
  33. }
  34. return new Promise((resolve, reject) => {
  35. const requestKey = getRequestKey(config)
  36. // 在请求开始前,对之前的请求做检查取消操作
  37. removePending(requestKey)
  38. const requestTask = wx.request({
  39. url: requestUrl,
  40. method,
  41. header: enableAuthorization ? header : {},
  42. data: data ?? {},
  43. success: (res) => {
  44. resolve(res.data)
  45. },
  46. fail: (err) => {
  47. reject('请求异常,请稍后再试'+err)
  48. },
  49. complete: () => {
  50. // 在请求结束后,移除本次请求
  51. removePending(requestKey)
  52. }
  53. })
  54. // 将当前请求添加到列表中
  55. addPending(requestKey, requestTask)
  56. })
  57. }
  58. /**
  59. * Http请求结果
  60. */
  61. export async function httpRequest<T extends { req?: unknown, rsp?: unknown }>(url: string, method: Method, params: HttpRequest<T>): Promise<void> {
  62. const { data, enableAuthorization, success, fail, complete } = params;
  63. const config: HttpConfig<T['req']> = {
  64. url,
  65. method,
  66. enableAuthorization: enableAuthorization ?? true,
  67. data,
  68. }
  69. await httpMiddleware(config).then((res) => {
  70. const data = res as HttpResponse<T['rsp']>
  71. switch (data.code) {
  72. case ResultCode.InvalidToken:
  73. // 退出登录
  74. // logout();
  75. return Promise.reject('令牌无效')
  76. case ResultCode.Success:
  77. success && success(data)
  78. return Promise.resolve()
  79. case ResultCode.Code:
  80. success && success(data)
  81. return Promise.resolve()
  82. default:
  83. return Promise.reject(data.msg)
  84. }
  85. }).catch((err) => {
  86. fail && fail(err);
  87. return Promise.reject(err);
  88. }).finally(() => {
  89. complete && complete()
  90. })
  91. }