循环执行GET请求直至满足条件时无输出问题排查
问题分析
isDone变量未定义:循环条件里的isDone没声明,JS会报错(严格模式下),就算没报错,!undefined为true会直接进入死循环。- 同步while循环阻塞线程:while是同步执行的,会一直占用JS主线程,根本没时间处理
getPickupsFromStore返回Promise的回调(.then里的代码),所以控制台永远不会输出内容。 - 未等待请求完成就重复循环:每次调用
getPickupsFromStore后立刻进入下一次循环,既没等请求返回检查条件,还会瞬间发起大量请求,直接阻塞程序。
修复方案
按照你要的「等待请求完成→检查条件→发送新请求」流程,用async/await改写循环,补上终止逻辑:
checkAndAcceptPickup(23); async function checkAndAcceptPickup(id: number) { let isDone = false; // 初始化终止标记 while (!isDone) { try { const data = await getPickupsFromStore(id); // 等待请求完成拿到数据 console.log(data); // 这里替换成你的实际终止条件,比如数据满足某个状态 if (data.status === 'completed') { isDone = true; // 满足条件后处理数据,比如调用业务函数 processPickupData(data); } // 可选:加延迟避免频繁请求压垮服务器 await new Promise(resolve => setTimeout(resolve, 1000)); } catch (error) { console.error('请求失败:', error); // 请求失败时延迟重试,避免无限报错 await new Promise(resolve => setTimeout(resolve, 3000)); } } } async function getPickupsFromStore(id: number) { const response = await axios.get(`你的实际接口URL`); return response.data; } // 示例:处理满足条件后的数据 function processPickupData(data: any) { console.log('满足条件,开始处理:', data); }
为什么setInterval效果差?
setInterval不管上次请求是否完成,到时间就发起新请求,容易造成请求堆积,出现多个未完成请求同时存在的情况;而await+while的组合是严格按「请求完成→检查→再请求」的顺序执行,完全不会有这个问题。
内容的提问来源于stack exchange,提问作者TryAnixx
相关产品推荐
相关产品推荐

