Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

promise.try vs promise.resolve error handling

I've been looking at bluebird promises and how promise.try differs from a promise.resolve.then when an error is thrown. Firstly some code using promise.try where it throws a synchronous error

Promise.try(function() {
    throw new Error('error');
}).catch(function(e) {
    console.log(e);
});

secondly some code which throws a synchronous error on resolve

Promise.resolve().then(function() {
    throw new Error('error');
}).catch(function(e) {
    console.log(e);
});

As far as I'm aware they both behave the same. Is promise.try essentially a cleaner way of resolving the promise?

The docs says promise.try:

will catch all errors in their Promise .catch handlers instead of having to handle both synchronous and asynchronous exception flows.

In the case of the example given in the docs:

function getUserById(id) {
    return Promise.try(function() {
        if (typeof id !== "number") {
            throw new Error("id must be a number");
        }
        return db.getUserById(id);
    });
}

if the synchronous error is thrown the asynchronous code will never be reached. Would there be any difference if you put the code above in a promise.resolve().then(..)?

Any clarification/examples of promise.try will be much appreciated.

like image 216
user3710396 Avatar asked May 06 '15 16:05

user3710396


People also ask

Which is better try and catch or then catch?

First, the code in try {...} is executed. If there were no errors, then catch (err) is ignored: the execution reaches the end of try and goes on, skipping catch . If an error occurs, then the try execution is stopped, and control flows to the beginning of catch (err) .

How do you catch errors from promises?

catch " around the executor automatically catches the error and turns it into rejected promise. This happens not only in the executor function, but in its handlers as well. If we throw inside a . then handler, that means a rejected promise, so the control jumps to the nearest error handler.

Is Promise resolve a promise?

Promise. resolve() method in JS returns a Promise object that is resolved with a given value. Any of the three things can happened: If the value is a promise then promise is returned.

Can we use try catch in promise?

If you throw an error inside the promise, the catch() method will catch it, not the try/catch. In this example, if any error in the promise1, promise2, or promise4, the catch() method will handle it.


2 Answers

As far as I'm aware they both behave the same.

Yes, mostly. However, the .then(…) callback will be invoked asynchronously, while Promise.try is synchronously executing your function.

Is promise.try essentially a cleaner way of resolving the promise?

Yes, it does provide a cleaner (less confusing) notation. But it's more of an optimisation, because it doesn't create any Promise.resolve(undefined) in the first place.

like image 126
Bergi Avatar answered Feb 09 '23 20:02

Bergi


Adding to Bergi's answer: Promise.try is for those times you can't use Promise.method. The goal is to avoid cases where you have sync exceptions mixed with rejections.

Generally, whenever you're considering using Promise.try give Promise.method a spin.

var fn = Promise.method(function(){
    // can throw or return here, and it'll behave correctly
});

Is roughly the same as:

var fn = function(){
     return Promise.try(function(){
        // can throw or return here, and it'll behave correctly
     });
});
like image 45
Benjamin Gruenbaum Avatar answered Feb 09 '23 19:02

Benjamin Gruenbaum