network.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { withResolvers } from "../promise";
  2. type Data = string | Record<string, any> | ArrayBuffer;
  3. type Option<T extends Data = Data> = Omit<WechatMiniprogram.RequestOption<T>, 'success' | 'fail' | 'complete'>;
  4. export type Request<T> = PromiseLike<T> & {
  5. abort: () => void;
  6. onProgressUpdate: (listener: WechatMiniprogram.UploadTaskOnProgressUpdateCallback) => () => void;
  7. };
  8. export function request<T extends Data>(option: Option<T>) {
  9. type Result = WechatMiniprogram.RequestSuccessCallbackResult<T>
  10. const { promise, resolve, reject } = withResolvers<Result, Request<Result>>();
  11. const task = wx.request({ ...option, success: resolve, fail: reject, });
  12. promise.abort = () => {
  13. task.abort();
  14. task.offHeadersReceived();
  15. task.offChunkReceived();
  16. }
  17. return promise
  18. }
  19. type UploadOption = Omit<WechatMiniprogram.UploadFileOption, 'success' | 'fail' | 'complete'>;
  20. export function upload<T extends string>(option: UploadOption, fn: (data: string) => T): Request<T> {
  21. const { promise, resolve, reject } = withResolvers<T, Request<T>>();
  22. const task = wx.uploadFile({
  23. ...option, success(res) {
  24. if (res.statusCode !== 200) reject({ errMsg: `上传失败(${res.statusCode})` })
  25. else resolve(fn(res.data));
  26. }, fail: reject,
  27. });
  28. promise.abort = () => {
  29. task.abort();
  30. task.offHeadersReceived();
  31. task.offProgressUpdate();
  32. }
  33. promise.onProgressUpdate = (listener: WechatMiniprogram.UploadTaskOnProgressUpdateCallback) => {
  34. task.onProgressUpdate(listener);
  35. return () => task.offProgressUpdate(listener);
  36. }
  37. return promise;
  38. }