Bluebird.js:重新抛出catch回调中的错误不会再次被捕获
Bluebird.js: Re-Throwing the error in catch callback is not caught again
我想知道为什么在这个例子中从未调用外部catch回调:
var returnPromise = function () {
return new Promise(function (resolve, reject) {
resolve('promise return value');
})
};
returnPromise().then(function () {
returnPromise().then(function() {
throw new Error('hello');
}).catch(function (err) {
console.log('got inner error', err);
return Promise.reject(err);
//throw err;
});
}).catch(function (err) {
console.log('got outer error', err);
});
我试图再次抛出捕获的错误,并返回一个被拒绝的Promise,但在这两种情况下都没有调用外部回调。
有人能告诉我为什么吗?
使用bluebird.js 3.0.2的实时示例:http://codepen.io/jjd/pen/wMqEpR?editors=001
EDIT:我忘记在第7行返回returnPromise(),这就是为什么代码不能按预期工作的原因。
被拒绝的承诺不是错误。你可以把一个错误变成一个被拒绝的承诺——这就是你在中所做的
.catch(function (err) {
return Promise.reject(err);
});
在那之后,它不再是一个错误条件。如果你想要一个错误条件,不要捕获并拒绝。
function returnPromise() {
return Promise.resolve('promise return value');
}
returnPromise().then(function () {
return returnPromise().then(function () {
throw new Error("failed");
})
}).catch(function (err) {
console.error("Outer: " + err);
});
如果您的catch处理程序只是做了一些日志记录,并且您想保留错误,那么只需重新抛出它
returnPromise().then(function () {
return returnPromise().then(function () {
throw new Error("failed");
}).catch(function (err) {
console.error("Inner: " + err);
throw err; // or new Error('...')
});
}).catch(function (err) {
console.error("Outer: " + err);
});
感谢@Tomalak,我现在理解了这个问题。Throw error in then()将自动返回Promise.reject(err)then()内部的Promise.rejectt()不会自动返回此Promise.request()。我们必须显式返回Promise.rejectt()
// Caught
Promise.resolve(10)
.then(() => {
throw new Error("hello"); // Auto return a reject promise
})
.catch(err => {
console.log(err);
});
// Uncaught error
Promise.resolve(10)
.then(() => {
Promise.reject("hello"); // Error happens => no catch happen
})
.catch(err => {
console.log(err);
});
// Caught
Promise.resolve(10)
.then(() => {
return Promise.reject("hello"); // Explicit return Promise.reject()
})
.catch(err => {
console.log(err);
});
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- RxJS:在循环中处理错误.js自定义驱动程序
- 如何在快递中抛出 404 错误.js
- 如何捕获服务器错误 JS
- 帆的“500”错误.js“测试项目”
- 快递中的会话未定义错误.js
- jquery.validate 中的错误.js“javaScript 运行时错误:无法获取未定义或空引用的属性'
- 角度动画中的奇怪错误.js
- 如何删除“对象在节点中没有方法'forEach'错误.js”
- 错误 JS 将发布数据发送到控制器 -CodeIgniter
- 使用摩卡在节点上测试错误.js函数
- 为什么 Magento js/varien/form.js IE 中的错误 - js fiddle
- 检测导致冻结等问题的错误 JS
- 三中的错误.js:相机不是三的实例.照相机
- 编译错误js.72.未处理的错误
- PHP停止表单重新加载显示错误Js
- 节点中的套接字挂断错误.js使用 https 时
- 纹理加载错误(JS动画)
- jasmineNodeOpts:执行量角器时出现意外的标识符错误.js