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
相关产品推荐
相关产品推荐

