You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:24:01