【发布时间】:2019-08-19 04:33:45
【问题描述】:
我正在使用颤振框架制作应用程序。
在此期间,我遇到了 Dart async 和 async* 中的关键字。
谁能告诉我它们有什么区别?
【问题讨论】:
我正在使用颤振框架制作应用程序。
在此期间,我遇到了 Dart async 和 async* 中的关键字。
谁能告诉我它们有什么区别?
【问题讨论】:
将函数标记为async 或async* 允许它使用async/await 作为Future。
两者之间的区别在于async* 将始终返回Stream 并提供一些语法糖以通过yield 关键字发出值。
因此我们可以做到以下几点:
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
此函数每秒发出一个值,每次递增。
【讨论】:
async 给你一个Future
async* 给你一个Stream。您将async 关键字添加到执行某些可能需要很长时间的工作的函数中。它返回包装在Future 中的结果。
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
您可以通过等待 Future 获得该结果:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
您添加 async* 关键字来创建一个函数,该函数一次返回一堆未来值。结果被封装在一个 Stream 中。
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
对此的技术术语是asynchronous generator function。你使用yield 来返回一个值而不是return,因为你没有离开这个函数。
您可以使用await for 等待 Stream 发出的每个值。
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
观看这些视频以了解更多信息,尤其是关于发电机的视频:
【讨论】:
async* 函数返回值。你只能产生一个值。但是,您可以调用return;(不带值)提前退出函数。