【问题标题】:What's the difference between async and async* in Dart?Dart 中的 async 和 async* 有什么区别?
【发布时间】:2019-08-19 04:33:45
【问题描述】:

我正在使用颤振框架制作应用程序。 在此期间,我遇到了 Dart asyncasync* 中的关键字。 谁能告诉我它们有什么区别?

【问题讨论】:

    标签: dart flutter


    【解决方案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
      }
    }
    

    进行中

    观看这些视频以了解更多信息,尤其是关于发电机的视频:

    【讨论】:

    • '观看这些视频' - 如果您也能提供 textual 参考,那就太好了。不是每个人都喜欢视频...
    • 如此完美的解释。我印象深刻
    • 很好的解释。
    • 如果 func with async* 不产生但返回值会发生什么?
    • @kent2508,Dart 不允许您从 async* 函数返回值。你只能产生一个值。但是,您可以调用return;(不带值)提前退出函数。
    猜你喜欢
    • 2020-12-11
    • 2013-08-11
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多