Dart中如何取消Future.wait?当异步任务返回false时终止流程
解决方案:当指定异步任务返回false时立即终止流程
原来的Future.wait会等待所有任务完成,无法满足「asyncFunction1返回false时立刻结束流程」的需求,以下是两种可行方案:
方案1:无需终止asyncFunction2,仅结束当前流程
如果asyncFunction2继续后台执行不影响业务,可以同时启动两个任务,优先监听asyncFunction1的结果:
// 同时启动两个异步任务 final future1 = asyncFunction1(); final future2 = asyncFunction2(); // 先获取asyncFunction1的结果 final result1 = await future1; if (!result1) { // 直接终止当前流程,不再等待asyncFunction2 return; // 替换为你需要的终止逻辑,比如抛出异常、返回特定值等 } // 若asyncFunction1返回true,再等待asyncFunction2完成 final result2 = await future2; // 后续业务处理
这种方式下,asyncFunction2会继续执行直到完成,但当前流程会在asyncFunction1返回false时立即结束。
方案2:主动终止asyncFunction2的执行
如果需要在asyncFunction1返回false时彻底停止asyncFunction2,需要让任务支持取消。Dart原生Future不支持取消,可通过以下两种方式实现:
方式A:使用CancelableOperation(async包)
先在pubspec.yaml添加依赖:
dependencies: async: ^2.11.0
然后包装asyncFunction2为可取消任务:
import 'package:async/async.dart'; // 创建可取消的asyncFunction2任务 final cancelableFuture2 = CancelableOperation.fromFuture( asyncFunction2(), onCancel: () { // 添加取消时的清理逻辑(如关闭资源) print('asyncFunction2已取消'); }, ); // 启动两个任务 final future1 = asyncFunction1(); // 等待asyncFunction1结果 final result1 = await future1; if (!result1) { // 取消asyncFunction2 cancelableFuture2.cancel(); // 终止当前流程 return; } // 获取正常完成的asyncFunction2结果 final result2 = await cancelableFuture2.value; // 后续处理
注意:此方式需要asyncFunction2内部支持响应取消。例如在循环中检查取消状态:
Future<bool> asyncFunction2(CancelableOperation cancelable) async { for (int i = 0; i < 10; i++) { if (cancelable.isCanceled) { return false; // 提前终止任务 } await Future.delayed(Duration(milliseconds: 100)); } return true; }
方式B:使用Isolate终止耗时任务
如果asyncFunction2是CPU密集型耗时任务,可通过Isolate执行,直接终止Isolate来停止任务:
import 'dart:isolate'; // 定义Isolate执行的任务 void _asyncFunction2Task(SendPort sendPort) async { // 模拟耗时计算 for (int i = 0; i < 100000000; i++) {} sendPort.send(true); } // 启动任务并监听结果 Isolate? taskIsolate; final future2 = (() async { final receivePort = ReceivePort(); taskIsolate = await Isolate.spawn(_asyncFunction2Task, receivePort.sendPort); final result = await receivePort.first; receivePort.close(); return result as bool; })(); // 处理asyncFunction1的结果 final result1 = await asyncFunction1(); if (!result1) { // 立即终止Isolate,停止任务执行 taskIsolate?.kill(priority: Isolate.immediate); return; } final result2 = await future2; // 后续处理
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

