智慧水务管理系统 - 精河县供水工程综合管理平台

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import CanceledError from '../cancel/CanceledError.js';
  2. import AxiosError from '../core/AxiosError.js';
  3. import utils from '../utils.js';
  4. const composeSignals = (signals, timeout) => {
  5. signals = signals ? signals.filter(Boolean) : [];
  6. if (!timeout && !signals.length) {
  7. return;
  8. }
  9. const controller = new AbortController();
  10. let aborted = false;
  11. const onabort = function (reason) {
  12. if (!aborted) {
  13. aborted = true;
  14. unsubscribe();
  15. const err = reason instanceof Error ? reason : this.reason;
  16. controller.abort(
  17. err instanceof AxiosError
  18. ? err
  19. : new CanceledError(err instanceof Error ? err.message : err)
  20. );
  21. }
  22. };
  23. let timer =
  24. timeout &&
  25. setTimeout(() => {
  26. timer = null;
  27. onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT));
  28. }, timeout);
  29. const unsubscribe = () => {
  30. if (!signals) { return; }
  31. timer && clearTimeout(timer);
  32. timer = null;
  33. signals.forEach((signal) => {
  34. signal.unsubscribe
  35. ? signal.unsubscribe(onabort)
  36. : signal.removeEventListener('abort', onabort);
  37. });
  38. signals = null;
  39. };
  40. signals.forEach((signal) => signal.addEventListener('abort', onabort));
  41. const { signal } = controller;
  42. signal.unsubscribe = () => utils.asap(unsubscribe);
  43. return signal;
  44. };
  45. export default composeSignals;