我正在使用flutter框架制作应用程序。 在此期间,我遇到了Dart中的关键字“ async”和“ async *”。 谁能告诉我他们有什么区别? 预先感谢。
答案 0 :(得分:74)
async
给您Future
async*
给您一个Stream
。您将async
关键字添加到一个函数中,该函数执行一些可能需要很长时间的工作。它返回包装在Future
中的结果。
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
您可以通过等待未来来获得结果:
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
}
}
观看这些视频以了解更多信息,尤其是有关Generators的视频:
答案 1 :(得分:8)
将函数标记为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;
}
}
此函数每秒发出一个值,每次都会递增