为什么console.error是一个方法而不是一个函数?

时间:2014-10-17 16:29:08

标签: javascript es6-promise

这些天我大量使用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()的工作方式是否有必要成为一种方法?

2 个答案:

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