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 asyncasync* 中的关键字。 谁能告诉我它们有什么区别?

【问题讨论】:

【参考方案1】:

将函数标记为asyncasync* 允许它使用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* 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

▲Dart-‘dart:async’库

Angular 测试中的 fakeAsync 和 async 有啥区别?

Flutter/Dart 中的 Future<void>, async, await, then, catchError

GCD 中的 Dispatch_barrier_async 和串行队列,它们之间有啥区别?

Dart:在循环中使用 Async 和 Await

Dart async proc