我想扩展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);
答案 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);