JavaScript中如何在多时段新闻拉取时按需终止循环
如何在循环调用API时,返回完整数据后终止循环?
我需要拉取跨度为一年的新闻数据,但自研API单次最多支持拉取90天数据(避免超时),所以把一年划分为多个时段循环调用API。现在希望当某次请求返回完整数据时,立刻终止循环,不再拉取更早时段的数据,该怎么实现?
我的现有代码:
function requestToDataNews(startDate, endDate) { return new Promise((resolve, reject) => { http.get(`/test=&start_date=${startDate}&end_date=${endDate}`, { timeout: 40000 } ) .then((response) => { if(response.data.response_code === 200){ resolve(response.data); } else { reject(response.data); } }) .catch((error) => { reject(error); }).finally(() => { commit('loadingBar', false); }); }) commit('loadingBar', true); let startDate = '2022-12-27'; let endDate = '2021-12-27'; const differentDays = tools.getDifferentDaysRange(endDate, startDate, 'days'); const currentNewsData = []; if (differentDays > 90 && differentDays <= 365) { for (let i = 0; i < Math.ceil(differentDays / 60); i += 1){ startDate = moment(endDate).subtract('months', 2).format('YYYY-MM-DD'); const newsData = requestToDataNews(startDate, endDate); if (newsData.is_success) { currentNewsData.push(...newsData.data); } } } }
预期效果:比如endDate为'2022-12-27'时,计算得到startDate为'2022-10-27';如果该时段返回的是完整数据,直接终止循环,不再查询更早的日期。
解决方案
你的代码核心问题在于未处理异步请求的结果,且缺少终止循环的触发逻辑,修改后代码如下:
// 将外层逻辑改为async函数,支持await处理异步请求 async function fetchNewsData() { commit('loadingBar', true); // 修正日期顺序:endDate应为较晚的日期,startDate为较早的日期 let endDate = '2022-12-27'; let startDate = moment(endDate).subtract(2, 'months').format('YYYY-MM-DD'); const differentDays = tools.getDifferentDaysRange(startDate, endDate, 'days'); const currentNewsData = []; if (differentDays > 90 && differentDays <= 365) { const totalPeriods = Math.ceil(differentDays / 60); for (let i = 0; i < totalPeriods; i += 1) { try { // 用await等待API返回真实数据 const newsData = await requestToDataNews(startDate, endDate); if (newsData.is_success) { currentNewsData.push(...newsData.data); // 替换为你实际判断"完整数据"的条件,比如API返回has_more=false,或数据量符合预期 if (!newsData.has_more) { break; // 满足完整数据条件,直接终止循环 } } // 更新为下一个更早时段的日期 endDate = moment(startDate).subtract(1, 'day').format('YYYY-MM-DD'); startDate = moment(endDate).subtract(2, 'months').format('YYYY-MM-DD'); } catch (error) { console.error('拉取数据失败:', error); // 可选择失败后继续循环或终止,这里默认继续 continue; } } } console.log('最终获取的新闻数据:', currentNewsData); } function requestToDataNews(startDate, endDate) { return new Promise((resolve, reject) => { http.get(`/test=&start_date=${startDate}&end_date=${endDate}`, { timeout: 40000 }) .then((response) => { if(response.data.response_code === 200){ resolve(response.data); } else { reject(response.data); } }) .catch((error) => { reject(error); }).finally(() => { commit('loadingBar', false); }); }); }
关键修改说明
- 异步处理:外层函数改为
async,用await等待API请求完成,确保拿到真实返回数据,而非Promise对象 - 循环终止:在获取有效数据后,添加"完整数据"判断条件,满足时用
break直接终止循环 - 日期修正:调整原代码中
startDate和endDate的顺序,符合API对日期范围的逻辑要求 - 错误容错:用
try/catch包裹请求逻辑,避免单个请求失败导致整个流程中断
内容的提问来源于stack exchange,提问作者peanut
相关产品推荐
相关产品推荐

