MST

星途 面试题库

面试题:Node.js 如何处理Promise的拒绝(rejection)并防止未处理的拒绝错误

在一个包含多个异步操作且使用Promise的Node.js项目里,描述如何有效地处理Promise的拒绝情况,以避免未处理的拒绝错误导致程序崩溃。同时说明如何区分正常的拒绝处理和未处理的拒绝场景,并举例实现相关代码。
32.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 处理Promise的拒绝情况
    • 链式调用 .catch:在Promise链的最后添加.catch块,捕获整个链中任何Promise的拒绝。
    const asyncOperation1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                reject(new Error('Operation 1 failed'));
            }, 1000);
        });
    };
    const asyncOperation2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('Operation 2 success');
            }, 1000);
        });
    };
    asyncOperation1()
       .then(result => {
            console.log(result);
        })
       .then(() => asyncOperation2())
       .catch(error => {
            console.error('Caught error:', error.message);
        });
    
    • try...catch 包裹 async/await:在 async 函数中使用 try...catch 块。
    const asyncFunction = async () => {
        try {
            await asyncOperation1();
            await asyncOperation2();
        } catch (error) {
            console.error('Caught error:', error.message);
        }
    };
    asyncFunction();
    
  2. 区分正常的拒绝处理和未处理的拒绝场景
    • 正常的拒绝处理:当在.catch块或try...catch块中捕获到拒绝时,属于正常处理。代码如下:
    const promise1 = new Promise((resolve, reject) => {
        reject(new Error('Normal rejection'));
    });
    promise1.catch(error => {
        console.log('Normal rejection handled:', error.message);
    });
    
    • 未处理的拒绝场景:如果没有为Promise添加.catch块,并且在async函数中没有使用try...catch块,Node.js会发出unhandledRejection事件。
    const promise2 = new Promise((resolve, reject) => {
        reject(new Error('Unhandled rejection'));
    });
    process.on('unhandledRejection', (reason, promise) => {
        console.log('Unhandled Rejection at:', promise, 'reason:', reason.message);
    });
    

通过在Promise链中恰当使用.catch以及在async函数中使用try...catch来处理拒绝,同时通过process.on('unhandledRejection')来捕获未处理的拒绝,这样可以有效避免未处理的拒绝错误导致程序崩溃。