Flutter中如何让Stream按调用顺序串行执行耗时操作f?
解决Dart异步操作串行执行的问题
原代码中,Stream的listen回调为异步函数时,Stream会同时触发每个事件的回调,导致三个f调用并发执行——由于耗时1秒的任务最先完成,所以输出顺序为1、3、5。要实现按调用顺序串行执行(前一个任务完成后再启动下一个),可以通过以下两种方式修改:
方案一:使用Stream的asyncMap方法
asyncMap会将流中每个元素转换为Future,并且强制等待前一个Future完成后再处理下一个元素,天然适配串行执行需求。修改后的代码如下:
import 'dart:async'; void main() { StreamController<int> controller = StreamController(); // 用asyncMap包裹任务,保证串行处理 controller.stream .asyncMap((event) => f(event)) .listen((_) {}); controller.add(5); controller.add(3); controller.add(1); } Future<void> f(int duration) async { await Future.delayed(Duration(seconds: duration)); print('$duration'); }
执行后会依次输出5、3、1,完全符合期望。
方案二:维护自定义任务队列
如果不需要依赖Stream,可以手动维护一个Future队列,通过链式调用then实现任务串行:
import 'dart:async'; // 初始化空任务队列 Future<void> _taskQueue = Future.value(); // 将任务追加到队列末尾,等待前一个任务完成后执行 void enqueueF(int duration) { _taskQueue = _taskQueue.then((_) => f(duration)); } void main() { enqueueF(5); enqueueF(3); enqueueF(1); } Future<void> f(int duration) async { await Future.delayed(Duration(seconds: duration)); print('$duration'); }
这种方式更灵活,适合无Stream场景下的串行调用,同样能得到期望的输出顺序。
内容的提问来源于stack exchange,提问作者Zhuoyuan.Li
相关产品推荐
相关产品推荐

