「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。
Promise
的catch
方法来了。
Promise.prototype.catch()
1. 基本介绍
Promise.prototype.catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数。
HttpX('/posts.json').then(function(posts) {
// ...
}).catch(function(error) {
// 处理 HttpX 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
上面这段代码中,HttpX
方法返回一个 Promise
对象,如果该对象状态从pending
变为resolved
,就会调用then()
方法指定的回调函数;如果异步操作抛出错误,那么状态就会从pending
变为rejected
,就会调用catch()
方法指定的回调函数,处理这个错误。另外,then()
方法指定的回调函数,如果运行中抛出错误,也会被catch()
方法捕获。
2. 案例
const promise = new Promise(function(resolve, reject) {
throw new Error('错误');
});
promise.catch(function(error) {
console.log(error);
});
// Error: 错误
上面这段代码中,promise
对象抛出了一个错误,会被catch
方法指定的回调函数捕获错误。
我们也可以采用try
和catch
的方法,看下面这两段代码
// 写法一
const promise = new Promise(function(resolve, reject) {
try {
throw new Error('错误');
} catch(error) {
reject(error);
}
});
promise.catch(function(error) {
console.log(error);
});
// 写法二
const promise = new Promise(function(resolve, reject) {
reject(new Error('错误'));
});
promise.catch(function(error) {
console.log(error);
});
这里也可以看出来,reject
方法的作用,和catch
抛出错误效果是一样的。
3. catch
上面说的catch
也可以抛出错误,但是Promise
状态已经变成resolved
,这个时候在抛出的错误是无效的。
const promise = new Promise(function(resolve, reject) {
resolve('ok');
throw new Error('test');
});
promise
.then(function(value) { console.log(value) })
.catch(function(error) { console.log(error) });
// ok
上面代码中,Promise 在resolve
语句后面,再抛出错误,不会被捕获,等于没有抛出。因为 Promise
的状态一旦改变,就永久保持该状态,不会再变了。
try/catch
和reject
跟的try/catch
方法不同的是,如果没有使用catch()
方法指定错误处理的回调函数,Promise
对象抛出的错误不会传递到外层代码,即不会有任何反应。
const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2);
});
};
someAsyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123