imaginaryfox
imaginaryfox

Reputation: 5

js Promise, cancel timeout

currently I am using a script to set a timeout of 3 seconds for my function before the next action is executed.

function sleep(ms)
{
    return new Promise((resolve) => setTimeout(resolve, ms));
}

sleep(3000).then(function()
{
    // next action
});

Now I want to find a way to end the 3-second timeout early e.g. by performing a mouse click. How would I go about implementing this?

Upvotes: 0

Views: 504

Answers (2)

JLRishe
JLRishe

Reputation: 101758

Something like this, perhaps?

function sleeper(ms) {
  var r;

  var p = new Promise(resolve => {
    r = resolve;
    setTimeout(resolve, ms);
  });

  return {
    skip: r,
    promise: p
  };
}

var s = sleeper(10000);

s.promise.then(() => {
  console.log('Promise finished!');
});

console.log('Waiting for 10 seconds... Click the button to skip the wait.');

document.getElementById('skip').addEventListener('click', s.skip);
<input type="button" id="skip" value="Skip delay" />

Upvotes: 2

Dabbas
Dabbas

Reputation: 3238

As an idea maybe you can do this:

var timeout, myResolver;
function sleep(ms)
{
    return new Promise((resolve) => {
            myResolver = resolve;
            timeout = setTimeout(resolve, ms);
       });
}

sleep(3000).then(function()
{
    // next action
});
function myStopFunction() {
    clearTimeout(timeout);
    myResolver();
}

Upvotes: 0

Related Questions