面试题答案
一键面试常见错误处理方式
- 使用
.catch()
全局捕获错误:在Promise链的最后添加.catch()
来捕获整个链中任何被拒绝的Promise产生的错误。 - 在
.then()
中处理错误:在.then()
回调函数中通过try...catch
块捕获同步代码中的错误,同时也可以通过返回一个被拒绝的Promise来处理异步错误。
.then()
和 .catch()
用法及区别
.then()
用法- 接受两个回调函数作为参数,第一个处理成功的结果,第二个处理失败的结果(不推荐使用第二个参数处理错误,而是推荐用
.catch()
)。 - 示例:
- 接受两个回调函数作为参数,第一个处理成功的结果,第二个处理失败的结果(不推荐使用第二个参数处理错误,而是推荐用
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功结果');
}, 1000);
});
promise.then(
value => {
console.log('成功:', value);
},
error => {
console.log('失败:', error);
}
);
.catch()
用法- 用于捕获Promise链中任何被拒绝的Promise产生的错误。
- 示例:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject('失败原因');
}, 1000);
});
promise
.then(value => {
console.log('成功:', value);
})
.catch(error => {
console.log('捕获到错误:', error);
});
- 区别
.then()
的第二个参数:只能捕获当前.then()
前面直接被拒绝的Promise的错误,对于Promise链中其他地方产生的错误无法捕获。而且这种方式使得代码结构不够清晰,错误处理逻辑和成功处理逻辑混在一起。.catch()
:可以捕获整个Promise链中任何被拒绝的Promise产生的错误,统一在一个地方处理错误,使代码结构更清晰,错误处理更集中。例如:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('第一个Promise错误');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('第二个Promise成功');
}, 1500);
});
promise1
.then(() => promise2)
.then(value => {
console.log('成功:', value);
})
.catch(error => {
console.log('捕获到错误:', error);
});
在这个例子中,.catch()
可以捕获 promise1
被拒绝产生的错误,如果使用 .then()
的第二个参数则无法捕获 promise1
产生的错误。