首页 > 解决方案 > 这些函数返回值在 Dart 中是如何工作的?

问题描述

Bloc 官方文档给出了这个代码片段:

Stream<int> countStream(int max) async* {
    for (int i = 0; i < max; i++) {
        yield i;
    }
}

这对我来说看起来很简单,直到我意识到该函数没有返回任何东西(没有return语句),但一直产生(对我来说 - 来自 python -return 语句不同)。

还有这个例子,更清楚:

Future<int> sumStream(Stream<int> stream) async {
    int sum = 0;
    await for (int value in stream) {
        sum += value;
    }
    return sum;
}

这里有一个int显式返回,如果我正确阅读,函数定义应该返回一个Future<int>类型:

Future<int> sumStream(Stream<int> stream) async { //...

现在,这是如何工作的?我在这里有点困惑。

提前致谢!阿克塞尔。

标签: dartbloc

解决方案


对于您的第一个示例, countStream 是使用async*设计的整数。(注意星星) 在这个流定义中,Yield在流流上发出一个新整数(如stream < int >所说的整数。 如果你消费流,你会得到 0,1,2,3,4 ,...,最大-1

在第二个片段中,将其读作: sumStream一个必须返回 int 的 Future。
更一般地说,一个 Future < T > 实例产生一个 T 类型的值。
sumStream 将消耗一个流(在参数中给出),只要这个流有值,就对它们求和并在完成时返回最后一个总和。Sum 是一个整数:Future 定义可以。

使用两者,您可以拥有:

> void main() async  {   
   print(await sumStream(countStream(5)));   
}

结果:10 (0+1+2+3+4)

由于 sumStream 是一个 Future,main 可以等待异步执行:它声明它使用异步函数的意图(异步声明),然后它可以使用 await 停止自己的执行,直到 sumStream 返回。

如果您在没有异步的情况下离开 main 的另一种方法是向 Future 添加一个.then子句:

void main()  {
  sumStream(countStream(5)).then((x)=>print(x));
  print("after sumStream");
}

结果:
在 sumStream
10之后

如您所见, sumStream 的主要传递已经开始,但尚未完成并首先打印(“在 sumStream 之后”)。
然后 main 完成了,但是 Dart 知道还有异步作业在运行,它会一直等到一切都完成,所以我们可以看到结果,但是一旦 Future sumStream 完成。

高温高压


推荐阅读