使用 async* 创建流
从生成器产生事件
使用 async* 创建流 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。
生成您自己的流
到目前为止,您一直在使用他人创建的流。现在,您将使用异步生成器亲自生成流,这是发出事件最简洁的方式。
async* 关键字
将函数标记为异步生成器后,它就会变成流生成器。它的返回类型是 Stream,并且可以随时间发出值。🚿
Stream<int> countTo(int n) async* {
// body uses yield
}yield 发出一个值
在异步生成器函数中,yield会向流中发送一个值。执行会在此处暂停,直到监听器准备好接收更多值。
Stream<int> oneTwo() async* {
yield 1;
yield 2;
}在循环中使用 yield
将yield与循环结合起来即可发出多个值。循环每执行一轮,就会自动将下一个数字发送到流中。
Stream<int> countTo(int n) async* {
for (var i = 1; i <= n; i++) yield i;
}在异步生成器中使用 await
由于该函数是异步的,因此您可以在多个 yield 之间使用await。这样便可以在发出下一个事件前获取数据或进行延迟。
Stream<int> ticker() async* {
while (true) {
await Future.delayed(Duration(seconds: 1));
yield DateTime.now().second;
}
}yield* 转发流
使用yield*,可以在生成器内部发出另一个流的所有事件。它会将整个流嵌入您自己的流中。
Stream<int> combined() async* {
yield* countTo(3);
yield 99;
}在监听前保持惰性
异步生成器函数在有人监听之前不会开始运行。只有当监听器请求每个值时,函数体才会执行。⏸️
暂停会遵循监听器状态
如果监听器暂停,生成器也会在下一个yield处暂停。这种背压机制可以防止生产者压垮使用者。
异步生成器中的错误
异步生成器函数中的throw会变成流上的错误事件。监听器可以像处理其他流错误一样捕获它。
Stream<int> risky() async* {
yield 1;
throw 'boom';
}使用您的生成器
请使用通常的方式,通过等待遍历读取生成的流。每个 yield 出的值都会按顺序进入循环。
await for (final n in countTo(3)) {
print(n);
}异步生成器与 StreamController
对于基于拉取、按顺序产生的输出,异步生成器比 StreamController 更简单。只有当事件来自外部回调时,才应使用控制器。
快速检查
如何从异步生成器函数中发出一个值?
回顾
您已经使用异步生成器创建了流,通过 yield 发送值,使用 yield* 转发流,并在事件之间进行等待。现在,您既可以使用流,也可以生成流。🎉
常见问题解答
「使用 async* 创建流」课时是免费的吗?
是的 — 「使用 async* 创建流」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。
「使用 async* 创建流」这节课中我会学到什么?
从生成器产生事件 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Dart Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 async* 创建流」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Dart Academy 课中编写并运行代码吗?
能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 await for 监听
- 单订阅流与广播流
- 转换流:map、where、take
- 使用 async* 创建流