MST

星途 面试题库

面试题:JavaScript Promise 的错误处理与并发控制

在 JavaScript 中,当多个 Promise 并发执行时(例如使用 Promise.all),如何优雅地处理其中某个 Promise 失败的情况,同时保证其他已成功的 Promise 继续执行其后续逻辑?请举例说明,并阐述在这种场景下如何进行错误边界的设置与统一处理。
17.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 处理某个 Promise 失败且保证其他成功 Promise 继续执行后续逻辑
    • 可以通过在每个 Promise 内部使用 try - catch 来捕获单个 Promise 执行过程中的错误,这样即使某个 Promise 失败,也不会影响 Promise.all 中其他 Promise 的执行。
    • 示例代码如下:
const promise1 = new Promise((resolve) => {
    setTimeout(() => {
        resolve('Promise 1 resolved');
    }, 1000);
});

const promise2 = new Promise((_, reject) => {
    setTimeout(() => {
        reject(new Error('Promise 2 rejected'));
    }, 1500);
});

const promise3 = new Promise((resolve) => {
    setTimeout(() => {
        resolve('Promise 3 resolved');
    }, 2000);
});

Promise.all([
    promise1.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        console.error('Promise 1 error:', error);
    }),
    promise2.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        console.error('Promise 2 error:', error);
    }),
    promise3.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        console.error('Promise 3 error:', error);
    })
]).then(() => {
    console.log('All promises (or their error - handling) have completed');
});
  1. 错误边界的设置与统一处理
    • 设置错误边界
      • 在上述示例中,catch 块就是针对每个 Promise 的错误边界,它捕获了单个 Promise 执行过程中抛出的错误,防止错误向上传递影响其他 Promise。
    • 统一处理
      • 可以将所有 catch 块中的错误收集到一个数组或者使用一个集中的错误处理函数。例如,我们可以定义一个全局的错误处理函数:
function handleError(error) {
    // 可以在这里进行日志记录等统一操作
    console.error('Global error handling:', error);
}

const promise1 = new Promise((resolve) => {
    setTimeout(() => {
        resolve('Promise 1 resolved');
    }, 1000);
});

const promise2 = new Promise((_, reject) => {
    setTimeout(() => {
        reject(new Error('Promise 2 rejected'));
    }, 1500);
});

const promise3 = new Promise((resolve) => {
    setTimeout(() => {
        resolve('Promise 3 resolved');
    }, 2000);
});

Promise.all([
    promise1.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        handleError(error);
    }),
    promise2.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        handleError(error);
    }),
    promise3.then(result => {
        console.log(result);
        return result;
    }).catch(error => {
        handleError(error);
    })
]).then(() => {
    console.log('All promises (or their error - handling) have completed');
});

这样就实现了在多个 Promise 并发执行时,对单个 Promise 失败的优雅处理以及错误的统一处理。