delay.js 986 B

123456789101112131415161718192021222324252627282930313233343536
  1. const { createAbortError } = require('./AbortController')
  2. /**
  3. * Return a Promise that resolves after `ms` milliseconds.
  4. *
  5. * @param {number} ms - Number of milliseconds to wait.
  6. * @param {{ signal?: AbortSignal }} [opts] - An abort signal that can be used to cancel the delay early.
  7. * @returns {Promise<void>} A Promise that resolves after the given amount of `ms`.
  8. */
  9. module.exports = function delay (ms, opts) {
  10. return new Promise((resolve, reject) => {
  11. if (opts && opts.signal && opts.signal.aborted) {
  12. return reject(createAbortError())
  13. }
  14. function onabort () {
  15. clearTimeout(timeout)
  16. cleanup()
  17. reject(createAbortError())
  18. }
  19. const timeout = setTimeout(() => {
  20. cleanup()
  21. resolve()
  22. }, ms)
  23. if (opts && opts.signal) {
  24. opts.signal.addEventListener('abort', onabort)
  25. }
  26. function cleanup () {
  27. if (opts && opts.signal) {
  28. opts.signal.removeEventListener('abort', onabort)
  29. }
  30. }
  31. })
  32. }