Dart中的async和async *有什么区别?


Answers:


112

将功能标记为asyncasync*允许其使用async/await关键字使用Future

两者之间的区别在于,async*它将始终返回aStream并提供一些语法糖来通过yield关键字发出值。

因此,我们可以执行以下操作:

Stream<int> foo() async* {
  for (int i = 0; i < 42; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

此函数每秒发出一个值,每次都会递增


2
您应该添加你在哪里得到的例子,是很好的阅读Dart Documentation,以及参考:)
Skizo-ozᴉʞS

3
@Skizo-ozᴉʞS链接已死。我能找到的最好的文档是:dart.dev/tutorials/language/streams
wdev

1
通过将函数标记为async *,我们可以使用yield关键字并返回数据流。
Yash

71

简短答案

  • 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;
  }
}

专门的术语是异步发电机功能。您使用yield返回值代替,而不是return因为您没有离开函数。

您可以await for用来等待Stream发出的每个值。

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // prints 1 to 60, one integer per second
  }
}

继续

观看这些视频以了解更多信息,尤其是有关Generators的视频:


2
“观看这些视频” –如果您还可以提供文字参考,那就太好了。并非每个人都喜欢视频……
阿空加瓜
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.