Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';我不能重写Promise的then()函数吗?_Javascript_Es6 Promise - Fatal编程技术网

Javascript Can';我不能重写Promise的then()函数吗?

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

我试图收集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 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
语句来上传错误。