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

能否让Future.wait()中的Futures按顺序执行?

解决Future.wait并行请求导致重复网络调用的问题

你当前用Future.wait会让两个请求并行触发,这就导致了两次网络请求的可能。要利用缓存避免重复请求,你需要让两个Future串行执行——等第一个请求完成并缓存后,再发起第二个请求。

具体实现

创建一个异步函数,通过await依次执行两个请求,再返回结果列表:

Future<List> fetchImageData(String image) async {
  // 先执行第一个请求,触发缓存
  final dimensions = await getImageDimensions(image);
  // 再执行第二个请求,此时直接读取缓存
  final imageData = await getImage(image);
  
  return [dimensions, imageData];
}

然后在FutureBuilder中使用这个函数替代Future.wait:

FutureBuilder<List>(
  future: fetchImageData(image),
  builder: (ctx, snapshot) {
    if (snapshot.hasData) {
      final dimensions = snapshot.data![0];
      final image = snapshot.data![1];
      // 这里构建你的UI
    } else if (snapshot.hasError) {
      // 处理错误状态
      return const Text('加载失败');
    } else {
      // 加载中状态
      return const CircularProgressIndicator();
    }
  },
)

顺序无关性说明

如果不在乎执行顺序,先调用getImage再调用getImageDimensions也完全可以,只要保证串行执行就行:

Future<List> fetchImageData(String image) async {
  final imageData = await getImage(image);
  final dimensions = await getImageDimensions(image);
  
  return [dimensions, imageData];
}

只要第一个请求完成并缓存了图片,第二个请求就会直接读取缓存,不会发起新的网络调用。

注意事项

确保你的网络请求/图片加载库(比如cached_network_image或自定义的HttpClient缓存逻辑)确实会缓存请求结果,这样串行执行才能达到预期的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:15:35