signal.js 786 B

1234567891011121314151617181920212223242526
  1. export async function raceWithSignal(promise, signal) {
  2. if (signal === undefined) {
  3. return promise;
  4. }
  5. let listener;
  6. return Promise.race([
  7. promise.catch((err) => {
  8. if (!signal?.aborted) {
  9. throw err;
  10. }
  11. else {
  12. return undefined;
  13. }
  14. }),
  15. new Promise((_, reject) => {
  16. listener = () => {
  17. reject(new Error("Aborted"));
  18. };
  19. signal.addEventListener("abort", listener);
  20. // Must be here inside the promise to avoid a race condition
  21. if (signal.aborted) {
  22. reject(new Error("Aborted"));
  23. }
  24. }),
  25. ]).finally(() => signal.removeEventListener("abort", listener));
  26. }