MST

星途 面试题库

面试题:Node.js中Promise异常处理及性能优化

在一个复杂的Node.js应用中,Promise链非常长且包含多个异步操作。请说明如何有效地处理Promise在链条中产生的异常,以避免异常丢失,并阐述如何对这种长Promise链进行性能优化,提高应用的整体执行效率。
16.9万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

处理Promise异常避免丢失

  1. 统一catch处理:在Promise链的最后添加一个.catch块,用于捕获整个链条中任何一个Promise抛出的异常。
    promise1()
      .then(result1 => promise2(result1))
      .then(result2 => promise3(result2))
      .catch(error => {
          console.error('捕获到Promise链中的异常:', error);
          // 可以在此处进行异常处理,如记录日志、返回友好的错误信息等
        });
    
  2. 每个Promise中处理:在每个.then处理函数中,显式地返回一个新的Promise,并在其.catch块中处理当前Promise可能抛出的异常,然后重新抛出异常,使异常能够继续传递到链条末尾的统一.catch块。
    promise1()
      .then(result1 => {
          return new Promise((resolve, reject) => {
            try {
              const newResult = promise2(result1);
              resolve(newResult);
            } catch (error) {
              reject(error);
            }
          });
        })
      .then(result2 => {
          return new Promise((resolve, reject) => {
            try {
              const newResult = promise3(result2);
              resolve(newResult);
            } catch (error) {
              reject(error);
            }
          });
        })
      .catch(error => {
          console.error('捕获到Promise链中的异常:', error);
        });
    

长Promise链性能优化

  1. 并行执行:如果Promise链中的某些操作相互独立,可以使用Promise.all将它们并行执行。
    const promise1 = () => new Promise(resolve => setTimeout(() => resolve('result1'), 1000));
    const promise2 = () => new Promise(resolve => setTimeout(() => resolve('result2'), 1500));
    Promise.all([promise1(), promise2()])
     .then(([result1, result2]) => {
        // 使用result1和result2进行后续操作
      });
    
  2. 减少不必要的中间操作:检查Promise链中是否存在一些不必要的中间转换或操作,去除这些冗余操作,以减少计算量。
  3. 优化异步操作本身:例如,优化数据库查询、网络请求等异步操作的实现,减少其执行时间。如合理设置数据库索引,优化网络请求的参数和频率等。
  4. 使用async/await:虽然async/await本质上还是基于Promise,但它的语法更简洁,使代码逻辑更清晰,也便于错误处理。并且在阅读和维护上更高效,一定程度上有助于优化代码性能和开发效率。
    async function main() {
      try {
        const result1 = await promise1();
        const result2 = await promise2(result1);
        const result3 = await promise3(result2);
        // 使用result3进行后续操作
      } catch (error) {
        console.error('捕获到异常:', error);
      }
    }
    main();