蓝鸟承诺中的Promise.try应该包含简单的声明吗?

时间:2017-03-22 07:37:49

标签: javascript node.js promise bluebird

使用promisified request模块,我想获取响应的body属性。不确定我是否应该使用Promise尝试。

那么哪一个是正确的?

A。没有Promise.try

request.getAsync("http://example.com")
       .then( x => x.body )
       .tap( x=> console.log('body:',x) )

B。使用Promise.try

request.getAsync("http://example.com")
       .then( x => Promise.try( () => x.body ) )
       .tap( x=> console.log('body:',x) )

3 个答案:

答案 0 :(得分:2)

在承诺链的第一个元素之后,保证错误会丢弃链的错误路径,并且可以被.then(null, errorHandler).catch(errorHandler)捕获。

因此,使用Bluebird的Promise.try()除了可靠地启动链之外没有任何意义。这样做只会增加您的代码并使其效率降低。

内链怎么样?

这更有趣。内链通常用于允许通过闭合访问早期结果。扁平链失去了这种能力。

考虑一下:

request.getAsync("http://example.com")
.then( x => {
    return untrusted.method().then((y) => other.method(x, y));
});

内链有自己的启动器untrusted.method(),可能会以两种方式之一导致失败:

  • 它可能会抛出。
  • 它可能会返回一个不可能的。

抛出是不可避免的(没有解决untrusted.method()),尽管抛出的错误可以在外链中捕获。

但是可以防范不可能的人。你可以写:

request.getAsync("http://example.com")
.then(x => {
    return Promise.try(untrusted.method).then((y) => other.method(x, y) );
});

现在Promise.try()确保内链具有可靠的开始。 Promise.try(untrusted.method)保证是可以的。

作为奖励,untrusted.method()引发的错误现在可以在外链或内链中捕获,这可能很有用,特别是对于错误恢复。

Promise.resolve(untrusted.method())同样可以防止返回不可用的但不允许在内链中捕获同步投掷。

总而言之,

  • 在承诺链中,Promise.try()中包含同步表达式没有任何价值。
  • 在承诺链中,Promise.try()中包含可信,异步函数/方法调用没有任何价值。
  • 在承诺链中,在Promise.try()中包装不受信任的函数/方法调用以保证内链的可靠启动可能具有很大的价值。

答案 1 :(得分:1)

  

不确定我是否应该使用Promise.try

,你不应该。在promise then回调中,将捕获所有同步异常并导致拒绝结果promise,您无需为此做任何事情。没有try / catch语句,没有Promise.try次调用。他们只是不必要的毛病。

Promise.try只应在承诺链的开头使用,而您尚未进行承诺回调。

答案 2 :(得分:0)

definition of this Promise.try是:

  

使用Promise.try启动承诺链。任何同步   例外情况将变成对已退回承诺的拒绝。

所以它取决于request.getAsync方法的实现。它会抛出任何异常吗?

如果答案为"否",则无需使用Promise.try

如果答案是"是",如果您需要捕获Promise.try抛出的错误作为被拒绝的承诺,可以使用request.getAsync。在这种情况下,你可以包装 request.getAsync内的Promise.try

Promise.try(() => {
    return request.getAsync("http://example.com");
}).tap(x => console.log('body:', x.nody));

请注意,如果答案是"是"但是不希望将异常作为被拒绝的承诺来捕获,您不需要使用Promise.try