Javascript Can';我不能重写Promise的then()函数吗?
我试图收集ES6 Promise中抛出的错误 我想这样做的一种方法是覆盖Javascript Can';我不能重写Promise的then()函数吗?,javascript,es6-promise,Javascript,Es6 Promise,我试图收集ES6 Promise中抛出的错误 我想这样做的一种方法是覆盖Promise.prototype.then函数。这是我的密码: 让originalThen=Promise.prototype.then; Promise.prototype.then=函数(onResolved,onRejected){ return originalThen.call(this、onResolved、onRejected)。catch(error=>{ log(`upload the error to
Promise.prototype.then
函数。这是我的密码:
让originalThen=Promise.prototype.then;
Promise.prototype.then=函数(onResolved,onRejected){
return originalThen.call(this、onResolved、onRejected)。catch(error=>{
log(`upload the error to server:${error}`);
投掷误差;
})
}
新承诺((解决、拒绝)=>{
决心(某事);
})
.然后(值=>{
//我认为这个错误应该被捕获并上传到服务器。
抛出新错误(“测试错误”)
}).catch(错误=>{
//前面的错误也应该在这里捕获。
console.log('catch()中捕获到错误')
})
当我在Firefox中运行这段代码时,我得到了一个
“太多递归”
错误。日志语句“将错误上载到服务器”
被反复执行!但我在代码中没有做任何递归操作。发生了什么?问题是.catch(onReject)
只是的语法糖。然后(undefined,onReject)
,catch
方法只是调用然后的包装器。从覆盖的中调用它,然后
会导致(无限)递归
相反,您需要使用originalThen
捕捉拒绝:
let originalThen = Promise.prototype.then;
Promise.prototype.then = function(onResolved, onRejected) {
return originalThen.call(originalThen.call(this, onResolved, onRejected), undefined, error => {
console.log(`upload the error to server: ${ error }`);
throw error;
});
}
也就是说,我认为覆盖然后是个坏主意
我试图收集ES6 Promise中抛出的错误
为此,您最好通过收集错误。您的许多承诺链都会故意使用错误,然后在本地处理它们-您只想将意外错误记录到服务器上。问题在于.catch(onReject)
只是的语法糖。然后(undefined,onReject)
,catch
方法只是调用然后的包装器。从覆盖的中调用它,然后
会导致(无限)递归
相反,您需要使用originalThen
捕捉拒绝:
let originalThen = Promise.prototype.then;
Promise.prototype.then = function(onResolved, onRejected) {
return originalThen.call(originalThen.call(this, onResolved, onRejected), undefined, error => {
console.log(`upload the error to server: ${ error }`);
throw error;
});
}
也就是说,我认为覆盖然后是个坏主意
我试图收集ES6 Promise中抛出的错误
为此,您最好通过收集错误。您的许多承诺链都会故意使用错误,然后在本地进行处理—您只想将意外错误记录到服务器上。我的意思是,递归就在那里。你是在呼唤一个承诺,而这个承诺最终又变成了一个自我,只是为了验证一个捕获?我只给你一个建议——那就不要推翻它。没有真正的案例需要覆盖它。你为什么要这样做?您可以在承诺链中使用多个.catch()
子句。.then()
的第二个参数是onError处理程序,就好像后面有一个.catch()。所以看起来您正在尝试实现承诺是如何工作的。我这样做是因为我想自动将每个承诺实例中的错误上传到服务器。如果我不这样做,我将不得不在每次使用Promise时编写一个额外的catch
语句来上传错误。我的意思是,递归就在那里。你是在呼唤一个承诺,而这个承诺最终又变成了一个自我,只是为了验证一个捕获?我只给你一个建议——那就不要推翻它。没有真正的案例需要覆盖它。你为什么要这样做?您可以在承诺链中使用多个.catch()
子句。.then()
的第二个参数是onError处理程序,就好像后面有一个.catch()。所以看起来您正在尝试实现承诺是如何工作的。我这样做是因为我想自动将每个承诺实例中的错误上传到服务器。如果我不这样做,我将不得不在每次使用Promise时编写一个额外的catch
语句来上传错误。