我一直在关注蓝鸟的承诺以及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的澄清/例子将不胜感激。
答案 0 :(得分: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
});
});
答案 1 :(得分:7)
据我所知,他们的行为都相同。
是的,主要是。但是,.then(…)
回调将异步调用,而Promise.try
正在同步执行您的函数。
promise.try本质上是解决承诺的一种更清洁的方式吗?
是的,它确实提供了更清晰(更少混淆)的表示法。但它更多的是优化,因为它首先不会创建任何Promise.resolve(undefined)
。