network.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  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({ ...option, success(res) { resolve(fn(res.data)); }, fail: reject, });
  23. promise.abort = () => {
  24. task.abort();
  25. task.offHeadersReceived();
  26. task.offProgressUpdate();
  27. }
  28. promise.onProgressUpdate = (listener: WechatMiniprogram.UploadTaskOnProgressUpdateCallback) => {
  29. task.onProgressUpdate(listener);
  30. return () => task.offProgressUpdate(listener);
  31. }
  32. return promise;
  33. }