如何优化判断双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
相关产品推荐
相关产品推荐

