Dart 中的 async 和 async* 有啥区别?
Posted
技术标签:
【中文标题】Dart 中的 async 和 async* 有啥区别?【英文标题】:What's the difference between async and async* in Dart?Dart 中的 async 和 async* 有什么区别? 【发布时间】:2019-08-19 04:33:45 【问题描述】:我正在使用颤振框架制作应用程序。
在此期间,我遇到了 Dart async
和 async*
中的关键字。
谁能告诉我它们有什么区别?
【问题讨论】:
【参考方案1】:将函数标记为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*,我们可以使用 yield 关键字并返回数据流。【参考方案2】:简答
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
进行中
观看这些视频以了解更多信息,尤其是关于发电机的视频:
Isolates and Event Loops Futures Streams async / await Generators【讨论】:
'观看这些视频' - 如果您也能提供 textual 参考,那就太好了。不是每个人都喜欢视频... 如此完美的解释。我印象深刻 很好的解释。 如果 func with async* 不产生但返回值会发生什么? @kent2508,Dart 不允许您从async*
函数返回值。你只能产生一个值。但是,您可以调用return;
(不带值)提前退出函数。以上是关于Dart 中的 async 和 async* 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Angular 测试中的 fakeAsync 和 async 有啥区别?
Flutter/Dart 中的 Future<void>, async, await, then, catchError