Flutter for循环内异步网络请求无需等待前序返回的实现方法
实现方案
你的代码串行执行是因为在循环内部直接await了每个请求,导致每次都要等前一个请求完成才会发起下一个。要实现并行请求,核心逻辑是先收集所有请求的Future实例,再统一等待所有请求执行完成。
第一步:修复请求方法的并发安全问题
你现有postData方法中使用了共享的responseModel变量,并发场景下会出现数据覆盖的问题,需要修改为每个请求单独创建实例:
Future<ResponseModel?> postData(int index) async { // 每个请求单独创建实例,避免并发竞态 final tempResponse = ResponseModel(); tempResponse.carModel = carModel[index]; return await _networkService .postdata<RequestModel, ResponseModel>( requestmodel: requestModel, responsemodel: ResponseModel(), path: ApiPath.API_DATA_LINK); }
第二步:修改循环逻辑为并行请求
使用Future.wait批量等待所有请求,所有请求会在你加入Future列表时同时发起,不需要等待前一个返回:
_allListModel() async { // 收集所有请求的Future,此时所有请求会并行发起 final requestFutures = <Future<ResponseModel?>>[]; for (var i = 0; i < carModel.length; i++) { requestFutures.add(postData(i)); } // 统一等待所有请求完成,结果顺序和添加Future的顺序完全一致,和接口返回顺序无关 differentList = await Future.wait(requestFutures); }
可选优化
- 如果需要兼容部分请求失败的场景,避免单个请求失败导致所有结果丢失,可以给每个Future添加异常捕获:
requestFutures.add(postData(i).catchError((error) { print("第$i个请求失败: $error"); return null; // 也可以返回自定义的错误占位实例 })); - 如果请求量超过20个,建议添加并发数控制,避免触发服务器限流规则或本地资源耗尽。
内容的提问来源于stack exchange,提问作者Said Kurt
相关产品推荐
相关产品推荐

