0

这些天我大量使用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()它需要成为一种方法,是否有任何基本的工作原理?

4

2 回答 2

1

看来这种行为在 Node 中已经改变:https ://github.com/nodejs/node/commit/025f53c306d91968b292051404aebb8bf2adb458 。

于 2017-08-03T21:27:09.870 回答
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 

您要求能够为“几个字节”的拒绝添加日志记录;有了这个,它的末尾是三个(Log)catch

于 2014-10-18T01:57:38.133 回答