Promise链式操作监控

Luna54 +0/-0 0 0 正常 2025-12-24T07:01:19 异步编程 · Promise

在现代JavaScript异步编程中,Promise链式操作是处理异步任务的核心模式。然而,在复杂的业务场景下,如何有效监控Promise链的执行状态、错误处理和性能表现成为关键挑战。

让我们通过一个完整的示例来演示Promise链式操作的监控实现:

// 创建一个带监控功能的Promise链
function createMonitoredPromiseChain() {
  // 监控器对象
  const monitor = {
    startTime: Date.now(),
    steps: [],
    errors: []
  };

  // 包装Promise执行,添加监控逻辑
  function wrapPromise(promiseFn, stepName) {
    return function(...args) {
      const start = Date.now();
      console.log(`开始执行 ${stepName}`);
      
      return promiseFn(...args)
        .then(result => {
          const duration = Date.now() - start;
          monitor.steps.push({
            name: stepName,
            duration,
            status: 'success',
            result
          });
          console.log(`${stepName} 执行成功,耗时 ${duration}ms`);
          return result;
        })
        .catch(error => {
          const duration = Date.now() - start;
          monitor.errors.push({
            name: stepName,
            duration,
            error
          });
          console.error(`${stepName} 执行失败:`, error);
          throw error; // 重新抛出错误,保持链式中断
        });
    };
  }

  // 模拟异步任务
  const tasks = {
    fetchUserData: wrapPromise(
      (userId) => Promise.resolve({ id: userId, name: `User${userId}` }),
      '获取用户数据'
    ),
    fetchUserPosts: wrapPromise(
      (userId) => Promise.resolve([`Post1-${userId}`, `Post2-${userId}`]),
      '获取用户文章'
    ),
    processPosts: wrapPromise(
      (posts) => {
        if (posts.length === 0) return Promise.reject(new Error('无文章数据'));
        return Promise.resolve(posts.map(p => p.toUpperCase()));
      },
      '处理文章数据'
    )
  };

  // 构建Promise链
  return tasks.fetchUserData(123)
    .then(user => {
      monitor.steps.push({ name: '用户初始化', duration: 0, status: 'success' });
      console.log('用户初始化完成');
      return user;
    })
    .then(user => tasks.fetchUserPosts(user.id))
    .then(posts => tasks.processPosts(posts))
    .then(processedPosts => {
      const endTime = Date.now();
      console.log('Promise链执行完成');
      console.log('监控摘要:', {
        totalDuration: endTime - monitor.startTime,
        steps: monitor.steps,
        errors: monitor.errors
      });
      return { user: { id: 123, name: 'User123' }, posts: processedPosts };
    })
    .catch(error => {
      console.error('Promise链发生错误:', error);
      throw error;
    });
}

// 执行监控的Promise链
createMonitoredPromiseChain()
  .then(result => {
    console.log('最终结果:', result);
  })
  .catch(error => {
    console.error('最终错误:', error);
  });

通过以上代码,我们可以实现对Promise链的完整监控:

  1. 执行时间监控 - 记录每个步骤的执行耗时
  2. 状态追踪 - 跟踪每个步骤的成功或失败状态
  3. 错误捕获 - 精确捕获并记录错误信息
  4. 性能分析 - 提供整体执行时间统计

在实际应用中,可以将监控数据集成到日志系统中,或者通过WebSocket实时推送给前端监控面板。这种模式特别适用于API调用链、数据处理流水线等复杂异步场景,帮助开发者快速定位性能瓶颈和错误来源。

推广
广告位招租

讨论

0/2000