promise.try vs promise.resolve错误处理

时间:2015-05-06 16:18:23

标签: promise bluebird

我一直在关注蓝鸟的承诺以及promise.try与promise.resolve的不同之处。当抛出错误时。首先使用promise.try的一些代码会引发同步错误

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

其次是一些在解析

时抛出同步错误的代码
Promise.resolve().then(function() {
    throw new Error('error');
}).catch(function(e) {
    console.log(e);
});

据我所知,他们的行为都相同。 promise.try本质上是一种解决承诺的更清洁方式吗?

文档说promise.try:

将捕获其Promise .catch处理程序中的所有错误,而不必处理同步和异步异常流。

对于文档中给出的示例:

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

如果抛出同步错误,将永远不会到达异步代码。如果你将上面的代码放在promise.resolve()。then(..)?

中会有什么区别吗?

任何有关promise.try的澄清/例子将不胜感激。

2 个答案:

答案 0 :(得分:11)

添加到Bergi的答案:Promise.try适用于那些您无法使用Promise.method的时间。目标是避免将同步异常和拒绝同步的情况。

通常情况下,只要您考虑使用Promise.tryPromise.method一个旋转。

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

大致相同:

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

答案 1 :(得分:7)

  

据我所知,他们的行为都相同。

是的,主要是。但是,.then(…)回调将异步调用,而Promise.try正在同步执行您的函数。

  

promise.try本质上是解决承诺的一种更清洁的方式吗?

是的,它确实提供了更清晰(更少混淆)的表示法。但它更多的是优化,因为它首先不会创建任何Promise.resolve(undefined)