这些天我大量使用ES6 Promises。因此,如果您未指定onRejected
函数,则很容易失去对异常的跟踪:
new Promise(function(resolve, reject) {
resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
return performDangerousTranformation(result);
});
如果我可以使用catch()
添加几个字节以确保异常进入控制台,那将是非常好的:
new Promise(function(resolve, reject) {
resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
return performDangerousTranformation(result);
}).catch(console.error);
不幸的是,这不起作用,因为console.error
是方法而不是函数。也就是说,您需要在调用console
时指定接收器console.error()
。您可以在浏览器控制台中轻松验证这一点:
> console.error('err');
prints err
> var f = console.error;
> f('err');
throws Illegal invocation exception
这意味着添加我的catch()
处理程序更加冗长:
new Promise(function(resolve, reject) {
resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
return performDangerousTranformation(result);
}).catch(function(error) { console.error(error); });
不可否认,在ES6中它更好一点:
new Promise(function(resolve, reject) {
resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
return performDangerousTranformation(result);
}).catch((error) => console.error(error));
但是避免额外打字会很好。更糟糕的是,如果你今天使用catch(console.error)
,你的异常会被忽略,这正是你要解决的问题! console.error()
的工作方式是否有必要成为一种方法?
答案 0 :(得分:1)
答案 1 :(得分:0)
如果您的宗教允许,您可以扩展Promise对象:
Promise.prototype.catchLog = function() {
return this.catch(
function(val) {
console.log("Promise has rejected with reason", val);
throw val; // continue with rejected path
}
);
};
然后
function crazy() { throw 99; }
Promise.resolve()
.then(crazy)
.catchLog();
>>> Promise has rejected with reason 99
您要求能够使用“几个字节”添加拒绝记录;这是catch
末尾的三个(L-o-g)。