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

Flutter/Dart异步代码执行滞后:forEach中await未生效提前返回空列表

问题根因

forEach 是同步遍历方法,不会等待内部异步任务执行完成。你在forEach回调中写的await仅作用于回调函数本身,不会阻塞外层movieSetter方法的执行流程,因此return语句会在所有searchByID请求返回前就执行,返回空数组。

解决方案

方案1:串行执行(逐次请求)

使用for...of循环替代forEach,外层方法会等待每一轮循环内的异步请求完成后再进入下一轮,所有请求完成后才会执行返回逻辑,适合接口有请求频率限制的场景。
代码示例:

async function movieSetter(query) {
  const m1 = await searchByText(query);
  const l1 = m1['Search'];
  const finalResult = [];
  for (const item of l1) {
    const detail = await searchByID(item.imdbID);
    finalResult.push(new Movie(detail));
  }
  return finalResult;
}

方案2:并行执行(批量请求,效率更高)

先把所有searchByID请求封装为Promise数组,再通过Promise.all等待所有请求同时完成,整体耗时只取决于最慢的单个请求,适合无接口频率限制的场景。
代码示例:

async function movieSetter(query) {
  const m1 = await searchByText(query);
  const l1 = m1['Search'];
  // 生成所有异步请求的Promise集合
  const requestPromises = l1.map(item => searchByID(item.imdbID));
  // 等待所有请求返回后统一转换为Movie实例
  const finalResult = (await Promise.all(requestPromises)).map(detail => new Movie(detail));
  return finalResult;
}

内容的提问来源于stack exchange,提问作者Atharv Karbhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:15:04