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

时间:2019-03-28 11:55:36

标签: dart flutter

我正在使用flutter框架制作应用程序。 在此期间,我遇到了Dart中的关键字“ async”和“ async *”。 谁能告诉我他们有什么区别? 预先感谢。

2 个答案:

答案 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)

将函数标记为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;
  }
}

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