使用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) )
答案 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
。