create.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { request as _request } from "../wx/network";
  2. const shareRequestCache = new Map<string, IRequestData<any>>();
  3. export function createRequest(option: IRequestCreateConfig) {
  4. const { baseURL } = option;
  5. return async <R, T>(config: IRequestConfig<R, T>) => {
  6. let { url, data, params, header, meta, transform = (params: any) => params, shareRequest, ..._config } = config;
  7. if (config.method === 'GET') {
  8. data = params;
  9. } else if (params) {
  10. const query = Object.entries(params).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
  11. url += `?${query.join('&')}`
  12. }
  13. const key = url;
  14. if (shareRequest && shareRequestCache.has(key)) {
  15. return shareRequestCache.get(key) as unknown as PromiseLike<IRequestData<T>>;
  16. }
  17. header ??= {};
  18. header['Authorization'] = meta?.ignoreToken ? '' : await option.token?.() ?? '';
  19. header['patientId'] = wx.getStorageSync('patientId') ?? '';
  20. header['doctorId'] = wx.getStorageSync('doctorId') ?? '';
  21. const promise = _request<IRequestData<T>>({
  22. url: /https?\:\/\//.test(url) ? url : `${baseURL}${url}`,
  23. header, data, ..._config,
  24. }).then(response => {
  25. if (response.statusCode === 200) {
  26. if (response.data.code === 200 && response.data.success !== false) {
  27. const data = Array.isArray(response.data.rows) && response.data.total != null
  28. ? { data: response.data.rows, total: response.data.total }
  29. : response.data.data
  30. return transform({ data: data as any, header: response.header });
  31. }
  32. throw { errMsg: response.data.msg || `app:${response.data.code}`, errno: `060202${response.data.code}` }
  33. }
  34. throw { errMsg: `${response.errMsg}:${response.statusCode}`, errno: `060201${response.statusCode}` }
  35. });
  36. if (shareRequest) shareRequestCache.set(key, <any>promise);
  37. return promise;
  38. }
  39. }