SetInterval inside promise. Why this promise resolves immediately?

Viewed 3008

I am trying to understand how promises work

let promise = new Promise( (resolve, reject) => {
    alert("started");
    let num = 0;
    let interval = setInterval(() => {
        alert(`state ${num}`);
        num += 2;
        if (num > 4) {
            clearInterval(interval);
            alert("finished");
            resolve()
        }
    }, 1000)
});
promise.then(alert('resolved'))

By some reason i see immediately alerts started, resolved
and then, with interval 1sec state 0, state 2, state 4 and finished.
Why promise resolves instantly? How to prevent promise from resolve until resolve() executed directly?

1 Answers

.then accepts a function as a parameter, not a plain statement or expression (unless said expression evaluates to a function). Use this instead:

promise.then(() => console.log('resolved'))

Demo:

let promise = new Promise( (resolve, reject) => {
    console.log("started");
    let num = 0;
    let interval = setInterval(() => {
        console.log(`state ${num}`);
        num += 2;
        if (num > 4) {
            clearInterval(interval);
            console.log("finished");
            resolve()
        }
    }, 1000)
});
promise.then(() => console.log('resolved'))

Related