promise.try与promise.resolve的错误处理区别

10

我一直在研究蓝鸟承诺(Bluebird Promises)以及当出现错误时,promise.try与promise.resolve.then的不同之处。首先,以下是使用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的方式吗?
文档表示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个回答

11

补充Bergi的回答: Promise.try是用于那些无法使用Promise.method的情况。目标是避免同步异常与拒绝混合的情况。

通常,每当你考虑使用Promise.try时,请给Promise.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
     });
});

如果我需要在这两者之间进行选择,使用 Promise.try - wdetac
取决于你是在定义一个方法还是调用一个方法。 - Benjamin Gruenbaum

8
据我所知,它们的行为方式相同。但是,.then(…)回调函数将异步调用,而Promise.try会同步执行您的函数。
是的,它提供了更简洁(不那么令人困惑)的符号。但它更多的是一种优化,因为它首先不创建任何Promise.resolve(undefined)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接