Search code examples
javascriptecmascript-6promisees6-promise

Cancel JavaScript Promise


I am trying to cancel a promise as given below:

function example(cancel = Promise.reject()) {
    return new Promise((resolve, reject) => {
        const timer = setTimeout(() => resolve('jack-jack'), 5000);
        cancel.then((res) => {
            clearTimeout(timer);
            reject('cancelled'); 
        }, ()=>{})
    });
}
var cancel=Promise.reject(); 
example(cancel).then((res) => console.log('res handled:' + res)).catch((err) => console.log('err handled:' + err));
console.log('attempting cancellation of promise');
cancel=Promise.resolve();

However I am not able to cancel it. What am I doing wrong over here?


Solution

  • You’ve assigned a rejected promise to a variable, passed the rejected promise into your function, and assigned a resolved promise to the variable. The two values the variable takes on are unrelated, and you can’t change the state of a settled promise.

    Pass in a promise you can resolve:

    let cancel;
    let cancelPromise = new Promise((resolve) => {
        cancel = resolve;
    });
    
    example(cancelPromise).then(…).catch(…);
    console.log('attempting cancellation of promise');
    cancel();
    

    function example(cancel = Promise.reject()) {
        return new Promise((resolve, reject) => {
            const timer = setTimeout(() => resolve('jack-jack'), 5000);
            cancel.then((res) => {
                clearTimeout(timer);
                reject('cancelled'); 
            }, ()=>{})
        });
    }
    
    let cancel;
    let cancelPromise = new Promise((resolve) => {
        cancel = resolve;
    });
    
    example(cancelPromise)
        .then((res) => console.log('res handled:' + res))
        .catch((err) => console.log('err handled:' + err));
    console.log('attempting cancellation of promise');
    cancel();