Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cancel JavaScript sleep? [duplicate]

This function is used to wait for millis number of second.

function delay(millis: number) {
    return new Promise((resolve, reject) => {

        setTimeout(() => {
            resolve();
        }, millis);
    });

My goal is then to return the timeout out of this function?

const timeout = await delay(20000);

on click somewhere else, user bored of waiting

clearTimeout(timeout)
like image 666
TSR Avatar asked Jul 16 '26 19:07

TSR


1 Answers

You can use an AbortSignal:

function delay(ms, signal) {
  return new Promise((resolve, reject) => {
    function done() {
      resolve();
      signal?.removeEventListener("abort", stop);
    }
    function stop() {
      reject(this.reason);
      clearTimeout(handle);
    }
    signal?.throwIfAborted();
    const handle = setTimeout(done, ms);
    signal?.addEventListener("abort", stop);
  });
}

Example:

const controller = new AbortController()
delay(9000, controller.signal).then(() => {
  console.log('Finished sleeping');
}, err => {
  if (!controller.signal.aborted) throw err;
  // alternatively:
  if (err.name != "AbortError") throw err;

  console.log('Cancelled sleep before it went over 9000')
});
button.onclick => () => {
  controller.abort();
};
like image 140
Bergi Avatar answered Jul 19 '26 09:07

Bergi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!