当我构建我的Promise并调用fail函数时,该函数的.catch函数应该捕获错误吗?但是在console.log中我仍然认为它没有被捕获(也是.catch函数被触发)。为什么?或者这是打算?我认为我从概念上得到了一些错误,并希望得到启发!
考虑以下示例:
var A = {
loadingPromise: null,
loadingPromiseFail: null,
loadingPromiseResolver: null,
init: function() {
this.loadingPromise = new Promise(
function(resolve, fail) {
this.loadingPromiseResolver = resolve;
this.loadingPromiseFail = fail;
}.bind(this)
);
this.loadingPromise.then(function(data) {
console.log('success');
}.bind(this));
this.loadingPromise['catch'](function(e, x) {
console.log('error', e);
}.bind(this));
},
doSomething: function() {
setTimeout(function(){
this.loadingPromiseFail('404');
}.bind(this), 1000);
}
}
A.init();
A.doSomething();
console.log:
error 404
uncaught exception: 404
为什么是第二个?
答案 0 :(得分:6)
这段代码
this.loadingPromise.then(function(data) {
console.log('success');
}.bind(this));
没有捕获,所以错误确实没有被捕获
这是你应该编写代码以正确使用Promise的方法
var A = {
loadingPromise: null,
loadingPromiseFail: null,
loadingPromiseResolver: null,
init: function() {
this.loadingPromise = new Promise(
function(resolve, fail) {
this.loadingPromiseResolver = resolve;
this.loadingPromiseFail = fail;
}.bind(this)
);
this.loadingPromise.then(function(data) {
console.log('success');
}.bind(this)).catch(function(e, x) {
console.log('error', e);
}.bind(this));
},
doSomething: function() {
setTimeout(function() {
this.loadingPromiseFail('404');
}.bind(this), 1000);
}
}
A.init();
A.doSomething();
https://jsfiddle.net/4g7yj38b/7/
关键是,您可以向Promise添加多个.then(实际上是.catch)......每个“链”都是独立的,所以 应该有一个.catch每个“链”以避免此控制台错误,即使这对代码的其余部分没有实际影响