扩展捕获原型以进行新的文物跟踪

时间:2019-02-28 10:44:22

标签: javascript prototype es6-promise catch-block

我想扩展Promise对象的常规catch原型,以便在遇到catch块时可以自动将错误记录到应用程序监视中。但是当尝试扩展捕获时,我很难将错误对象从Promise对象中移出。

所以基本上,而不是在每个then()。catch()

中都这样做
axios.get('sample/url')
    .then(response => { stuff })
    .catch(error => {
        newrelic.noticeError(error);
    });

我想扩展Promise原型,但是无法从中获取错误对象。

(function (Promise) {
    const originalCatch = Promise.prototype.catch;

    Promise.prototype.catch = function () {
        console.log('> > > > > > called .catch on %o with arguments: %o', this, arguments);

        if (typeof newrelic !== 'undefined') {
            newrelic.noticeError(arguments[0]);
        } else {
            console.error(arguments);
        }

        return originalCatch.apply(this, arguments);
    };
})(Promise);

2 个答案:

答案 0 :(得分:2)

catch的参数是回调函数,而不是错误。

您正在寻找

Promise.prototype.catch = (function(originalCatch) {
    return function(onRejected) {
        console.log('> > > > > > called .catch on %o with arguments: %o', this, arguments);
        return originalCatch.call(this, error => {
            if (typeof newrelic !== 'undefined') {
                newrelic.noticeError(error);
            } else {
                console.error(error);
            }
            return onRejected(error);
       });
    };
})(Promise.prototype.catch);

顺便说一句,我建议避免干预Promise.prototype。由于错误处理程序为installed using then或否,因此拦截每个catch调用将为您带来一些误报(您实际上不想登录)以及误报(您应该已经捕获)。 catch完全被调用。最好通过简单的可重用性,明确指出要在哪里监视错误?

function monitorError(error) {
    if (typeof newrelic !== 'undefined') {
        newrelic.noticeError(error);
    } else {
        console.error(error);
    }
}

您可以使用简单的方法明确地将其插入或追加到承诺链中

.catch(monitorError)

答案 1 :(得分:2)

您可以直接通过Promise本身来调用回调,以便对参数进行求值:

(function (Promise) {
    const originalCatch = Promise.prototype.catch;

    Promise.prototype.catch = function () {
        console.log('> > > > > > called .catch on %o with arguments: %o', this, arguments);

        if (typeof newrelic !== 'undefined') {
            originalCatch.apply(this, [newrelic.noticeError]);
               //^--- changed here.
        } else {
            console.error(arguments);
        }

        return originalCatch.apply(this, arguments);
    };
})(Promise);

示例工作代码:https://jsfiddle.net/7qgjr6fw/3/