如何在JavaScript异步async函数中编写循环,解决循环不生效问题
问题原因
你的代码存在3个核心错误:
- 变量作用域问题:
ticket是在while循环内部用let声明的块级变量,首次执行while判断条件时ticket还未定义,会直接抛出ReferenceError,循环完全无法启动。 - 接口调用逻辑错误:该机票搜索接口的标准调用逻辑是仅发起1次
/search请求获取唯一的searchId,之后重复用同一个searchId调用/tickets接口轮询分片的机票数据,直到返回的stop字段为true。你的代码每次循环都重新调用/search获取新的searchId,相当于每次都重启搜索流程,永远不会到达结束条件。 - URL参数拼接错误:如果
commit对象包含多个键值对,直接拼接Object.keys(commit)和Object.values(commit)会得到逗号分隔的错误参数格式,无法被服务端正确识别。
修正后代码
(async () => { let arr = [] // 提前调用一次search接口获取searchId const searchRes = await fetch("https://front-test.beta.aviasales.ru/search") const commit = await searchRes.json() // 正确拼接查询参数,支持多键值对场景 const searchParams = new URLSearchParams(commit).toString() const ticketsURL = "https://front-test.beta.aviasales.ru/tickets?" + searchParams // 提前定义ticket,初始stop设为false保证首次循环执行 let ticket = { stop: false } while(ticket.stop !== true) { const ticketFetch = await fetch(ticketsURL) ticket = await ticketFetch.json() console.log(ticket) arr.push(ticket) } })()
额外说明
- 建议添加请求异常捕获逻辑,避免接口报错导致整个异步函数终止
- 可以适当添加轮询间隔,避免短时间内高频请求触发服务端限流
内容的提问来源于stack exchange,提问作者Batyrkhan Akzholov
相关产品推荐
相关产品推荐

