如何优化数据请求函数中的if语句,高效保留原有逻辑?
Hey,我来帮你搞定这个需求!既要实现每5秒自动触发dataRequest,还要优化里面的if语句同时完全保留原有逻辑,对吧?直接上完整的解决方案:
完整实现代码
// 初始化所需变量 let latest = null; let history = []; // 模拟你的dataRequest函数(替换成实际的异步数据获取逻辑) async function dataRequest() { // 示例:假设这里是接口请求 const data = await fetch("/api/data").then(res => res.json()); // 👇 优化后的条件判断逻辑,完全保留原有业务效果 const targetItem = data?.item_1; if (targetItem) { latest = targetItem; // 生成新的历史数组(避免直接修改原数组,保持不可变性) history = [...history, latest]; } } // 设置定时器:每5秒触发一次数据请求 const requestTimer = setInterval(async () => { await dataRequest(); }, 5000); // 可选:后续需要停止定时任务时调用 // clearInterval(requestTimer);
核心优化点说明
1. 定时触发逻辑
- 用
setInterval实现每5秒自动调用,因为dataRequest是异步函数,所以在定时器回调里加await,确保每次请求完成后再进入下一次计时,避免请求堆积 - 保存定时器ID
requestTimer,方便后续随时停止定时任务
2. if语句的高效优化
原有逻辑是仅当data.item_1存在时,才更新latest和历史数组,优化后的写法有这些优势:
- 使用**可选链操作符
?.**安全访问嵌套属性,避免data为null/undefined时抛出Cannot read property 'item_1' of null的错误 - 提前提取
targetItem变量,避免重复访问data.item_1,既提升了代码可读性,也减少了不必要的属性访问操作 - 逻辑和原有完全一致:只有当
targetItem为真值时才执行更新操作
如果你的原有if语句是需要严格判断data.item_1不为null或undefined(比如要保留0、''这类假值),可以再结合**空值合并操作符??**进一步精准控制:
const targetItem = data?.item_1 ?? null; if (targetItem !== null) { latest = targetItem; history = [...history, latest]; }
这种写法会跳过null和undefined,但保留其他所有值,完美匹配更精细的业务逻辑。
额外建议
如果dataRequest可能出现请求失败的情况,建议在定时器回调里加上错误捕获,避免单个请求失败导致后续所有定时任务中断:
const requestTimer = setInterval(async () => { try { await dataRequest(); } catch (err) { console.error('数据请求出错啦:', err); // 这里可以加错误重试逻辑或者告警逻辑 } }, 5000);
内容的提问来源于stack exchange,提问作者dustintheweb
相关产品推荐
相关产品推荐

