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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:45:32