面试题答案
一键面试Promise的状态
- Pending(进行中):初始状态,既没有被兑现(resolved),也没有被拒绝(rejected)。
- Fulfilled(已兑现):意味着操作成功完成,Promise状态从Pending变为Fulfilled。
- Rejected(已拒绝):意味着操作失败,Promise状态从Pending变为Rejected。
状态变化
- 从Pending到Fulfilled:当Promise执行器(
new Promise((resolve, reject) => { /* 执行器代码 */ })
中的回调函数)调用resolve
方法时,Promise状态从Pending变为Fulfilled。例如:
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('操作成功');
}, 1000);
});
- 从Pending到Rejected:当Promise执行器调用
reject
方法时,Promise状态从Pending变为Rejected。例如:
new Promise((resolve, reject) => {
setTimeout(() => {
reject('操作失败');
}, 1000);
});
注意,Promise状态一旦改变,就不会再变。
处理异步操作异常的方式及代码示例
- .catch()方法:在Promise链中,.catch() 可以捕获链中任何一个Promise被拒绝时的错误。例如:
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('模拟异步操作失败');
}, 1000);
});
}
asyncOperation()
.then(result => {
console.log(result);
})
.catch(error => {
console.error('捕获到错误:', error);
});
- try...catch(针对async/await):当使用
async/await
时,可以在async
函数内部使用try...catch
捕获错误。例如:
async function asyncFunction() {
try {
await asyncOperation();
} catch (error) {
console.error('捕获到错误:', error);
}
}
asyncFunction();
- .finally()方法:
.finally()
方法用于无论Promise是被解决还是被拒绝,都会执行的回调。虽然它不直接处理错误,但可以在清理等操作中使用,避免错误处理影响到这里的逻辑。例如:
asyncOperation()
.then(result => {
console.log(result);
})
.catch(error => {
console.error('捕获到错误:', error);
})
.finally(() => {
console.log('无论成功或失败,都会执行这里');
});