为什么没有触发`.catch`回调
Why is `.catch` callback not triggered
我有以下使用本机承诺的代码:
function getUser() {
return new Promise(function (resolve, reject) {
reject();
});
}
function changeUser() {
return new Promise(function (resolve, reject) {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
});
});
}
changeUser().then(function () {
console.log('done');
}).catch(function () {
console.log('error'); // this is not triggered
});
当我运行它时,不执行具有console.log('error');
的第一个catch
块。为什么?原生promise的实现与Q
不同吗?
因为您从未reject
,所以您从changeUser
返回的承诺。您只是从getUser
返回的promise的链中的throw
,它在该链中级联,但不会影响在changeUser
中构建的new Promise
。
任一:
return new Promise(function (resolve, reject) {
return getUser().then(resolve, function (responseData, test) {
console.log('boo error'); // this logs `boo error`
reject();
});
});
或者:
function changeUser() {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
});
}
因为您在changeUser
函数中嵌套了两个不同的promise链。resolve
和reject
函数从未在该函数中被调用,因此throw {}
不会冒泡。如果你在Chrome中执行此操作,你还会在控制台中收到一条"Uncaught promise"消息。
要么通过以下方式修复:
return new Promise(function (resolve, reject) {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
}).then(resolve, reject);
});
或者通过完全移除return new Promise
线。
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- http/rxjs catch回调中的Angular 2重定向导致TypeError:无法读取属性'订阅'
- 错误处理try&catch+回调
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- Bluebird.js:重新抛出catch回调中的错误不会再次被捕获
- 为什么没有触发`.catch`回调
- 为什么两者都承诺's然后&catch回调被调用
- 即使我在所有 then-able 中使用拒绝回调,我是否总是需要在最后需要 catch()