MST

星途 面试题库

面试题:JavaScript中Promise的状态变化及如何处理异常

请简述JavaScript中Promise有哪些状态,状态是如何变化的。并说明在使用Promise时,有哪些方式可以处理异步操作中可能出现的异常,同时给出相应的代码示例。
40.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

Promise的状态

  1. Pending(进行中):初始状态,既没有被兑现(resolved),也没有被拒绝(rejected)。
  2. Fulfilled(已兑现):意味着操作成功完成,Promise状态从Pending变为Fulfilled。
  3. 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状态一旦改变,就不会再变。

处理异步操作异常的方式及代码示例

  1. .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);
    });
  1. try...catch(针对async/await):当使用 async/await 时,可以在 async 函数内部使用 try...catch 捕获错误。例如:
async function asyncFunction() {
    try {
        await asyncOperation();
    } catch (error) {
        console.error('捕获到错误:', error);
    }
}

asyncFunction();
  1. .finally()方法.finally() 方法用于无论Promise是被解决还是被拒绝,都会执行的回调。虽然它不直接处理错误,但可以在清理等操作中使用,避免错误处理影响到这里的逻辑。例如:
asyncOperation()
  .then(result => {
        console.log(result);
    })
  .catch(error => {
        console.error('捕获到错误:', error);
    })
  .finally(() => {
        console.log('无论成功或失败,都会执行这里');
    });