You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化判断双API状态的JavaScript checkData方法代码?

优化多条件判断的API状态处理代码

原代码通过大量if-else判断两个API的状态,逻辑分散且可读性差,我们可以通过状态映射表和解构赋值来简化逻辑,同时修复同步函数中错误使用Promise.reject的问题。

优化后的代码

const checkData = (data, allData, failFlag) => {
  // 解构两个API的状态和返回值,提升代码可读性
  const [api1, api2] = data || [];
  const api1Valid = api1?.status === 'fulfilled' && api1.value;
  const api2Valid = api2?.status === 'fulfilled' && api2.value;

  // 定义状态组合与处理逻辑的映射表,替代冗长if-else
  const statusMap = {
    'fulfilled-fulfilled': () => {
      if (api1Valid && api2Valid) {
        allData.push(...api1Valid, ...api2Valid);
        return 'NONE';
      }
      return failFlag;
    },
    'rejected-fulfilled': () => {
      allData.push(...api2Valid);
      return 'INTERNAL';
    },
    'fulfilled-rejected': () => {
      allData.push(...api1Valid);
      console.log('All data with fail flag', allData, 'EXTERNAL');
      return 'EXTERNAL';
    },
    'rejected-rejected': () => {
      // 同步函数内Promise.reject无法被捕获,改为返回错误标识
      return 'ALL';
    }
  };

  // 生成状态组合键,处理data为空的边界情况
  const statusKey = `${api1?.status || 'rejected'}-${api2?.status || 'rejected'}`;
  // 执行对应逻辑更新failFlag
  const newFailFlag = statusMap[statusKey]?.() || failFlag;

  return { errorFlag: newFailFlag, accounts: allData };
};

优化核心点

  • 解构与前置判断:提前解构API结果并校验有效性,避免后续重复判断,简化逻辑。
  • 状态映射表:用对象键值对封装不同状态组合的处理逻辑,替代嵌套if-else,后续新增状态只需添加新的键值对,扩展性更强。
  • 边界错误修复:原代码在同步函数中调用Promise.reject不会被外部捕获,改为直接返回错误标识;通过可选链?.处理data为空或API结果不存在的情况,避免报错。
  • 可读性提升:逻辑拆分清晰,每个状态组合的处理逻辑独立,便于维护和排查问题。

额外异步场景建议

如果该函数是处理Promise.allSettled的结果,建议直接在异步流程中处理,更符合异步代码规范:

const fetchAndCheckData = async () => {
  const results = await Promise.allSettled([fetchInternalAPI(), fetchExternalAPI()]);
  const allData = [];
  let failFlag = 'NONE';

  const [api1, api2] = results;
  // 先收集所有成功的数据
  api1.status === 'fulfilled' && allData.push(...api1.value);
  api2.status === 'fulfilled' && allData.push(...api2.value);

  // 再判断错误状态
  if (api1.status === 'rejected' && api2.status === 'rejected') {
    failFlag = 'ALL';
    throw new Error('Both APIs are rejected');
  } else if (api1.status === 'rejected') {
    failFlag = 'INTERNAL';
  } else if (api2.status === 'rejected') {
    failFlag = 'EXTERNAL';
    console.log('All data with fail flag', allData, failFlag);
  }

  return { errorFlag: failFlag, accounts: allData };
};

内容的提问来源于stack exchange,提问作者FrontEnd learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:35:35