MST
星途 面试题库

面试题:JavaScript期约(Promise)链式调用中的错误处理

编写一段代码,在Promise链式调用中有四个Promise,其中第二个Promise会抛出错误。要求使用try - catch和Promise的catch方法两种方式来捕获错误并正确处理,说明这两种方式在处理错误上的不同点。
28.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

使用 try - catch 捕获错误

async function tryCatchExample() {
    try {
        const result1 = await new Promise((resolve) => {
            setTimeout(() => {
                resolve('第一个Promise成功');
            }, 1000);
        });
        console.log(result1);

        const result2 = await new Promise((_, reject) => {
            setTimeout(() => {
                reject('第二个Promise抛出错误');
            }, 1000);
        });
        console.log(result2);

        const result3 = await new Promise((resolve) => {
            setTimeout(() => {
                resolve('第三个Promise成功');
            }, 1000);
        });
        console.log(result3);

        const result4 = await new Promise((resolve) => {
            setTimeout(() => {
                resolve('第四个Promise成功');
            }, 1000);
        });
        console.log(result4);
    } catch (error) {
        console.error('try - catch捕获到错误:', error);
    }
}

tryCatchExample();

使用 Promise 的 catch 方法捕获错误

function promiseCatchExample() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('第一个Promise成功');
        }, 1000);
    })
      .then(result1 => {
            console.log(result1);
            return new Promise((_, reject) => {
                setTimeout(() => {
                    reject('第二个Promise抛出错误');
                }, 1000);
            });
        })
      .then(result2 => {
            console.log(result2);
            return new Promise((resolve) => {
                setTimeout(() => {
                    resolve('第三个Promise成功');
                }, 1000);
            });
        })
      .then(result3 => {
            console.log(result3);
            return new Promise((resolve) => {
                setTimeout(() => {
                    resolve('第四个Promise成功');
                }, 1000);
            });
        })
      .catch(error => {
            console.error('Promise的catch方法捕获到错误:', error);
        });
}

promiseCatchExample();

两种方式处理错误的不同点

  1. 语法结构
    • try - catch:是同步代码块的错误捕获机制,使用try包裹可能抛出错误的代码,catch捕获并处理错误,常用于async/await函数中,因为await会暂停函数执行直到Promise被解决。
    • Promise的catch:是Promise链式调用中的一部分,通过.catch方法来捕获Promise链中任何一个被拒绝的Promise,它是异步操作的错误处理方式,适用于链式调用的场景。
  2. 错误捕获范围
    • try - catch:只能捕获try块内同步代码和通过await暂停的Promise中抛出的错误。如果await后的Promise没有被暂停(例如在另一个异步函数中),try - catch无法捕获其错误。
    • Promise的catch:能捕获整个Promise链中任何一个被拒绝的Promise的错误,无论该Promise是在链式调用的何处被拒绝,只要后续有.catch方法,就能捕获到错误。
  3. 代码风格
    • try - catch:使代码看起来更像传统的同步代码错误处理方式,在处理async/await时更符合常规的错误处理习惯,代码结构相对清晰,尤其在多个await语句顺序执行的情况下。
    • Promise的catch:更适合Promise链式调用的场景,使代码保持链式调用的风格,在处理多个异步操作依次执行并处理错误时,代码结构简洁明了,不需要额外的async/await语法。