javascriptpromisersvp.js

Confused when make a promise from setTimeout


I am new to Promise. I wrote two examples:

The first one is:

new RSVP.Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve("HI")
    }, 3000);
}).then(function (result) {
    console.log(result);
});

This one will print out "HI" after 3 seconds as I expected. This is because "then" waits on it, and is only called when the promise settles.

The second one is:

new RSVP.Promise(function (resolve, reject) {
    resolve();
}).then(function () {
    return RSVP.Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve("HI")
        }, 3000);
    });
}).then(function (result) {
    console.log(result);
});

I thought it will also print "HI" after 3 seconds. But nothing happened. I thought the second "then" will wait on the the promise in the first "then".

what is wrong for the second example and how to fix it?


Solution

  • tl;dr

    You need to construct RSVP promises with new operator.

    Fixed code

    new RSVP.Promise(function (resolve, reject) {
        resolve();
    }).then(function () {
        // Note the `new` in the next line
        return new RSVP.Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve("HI")
            }, 3000);
        });
    }).then(function (result) {
        console.log(result);
    }).catch(console.error);
    

    In your case, it was not doing anything because the promise creation in the then handler failed, as new was not used with that. Since, the then handler was throwing an exception, it returned a failed promise. That is why the next then handler also was not executed.

    When I executed your original code with the catch handler attached, like I have shown above, I got the following error.

    [TypeError: Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.]

    Rule of thumb: Always use the catch handler when you are dealing with promises.