official Bloc documentation提供以下代码段:

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 { //...

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

提前致谢!
阿克塞尔

最佳答案

对于第一个示例,countStream是使用 async * 设计的整数的。 (照顾星星)
在此流定义中,Yield 在流上向发出一个新的整数(由stream 表示的整数)。
如果消耗流,则将获得0、1、2、3、4,...,max-1

在第二个代码段中,将其读取为:sumStream ,这是一个必须返回int的Future。
更一般地,Future 实例产生类型T的值。
sumStream将使用一个流(在参数中给出),只要该流具有值,将它们求和并在完成时返回最后的总和。 Sum是整数:可以使用Future定义。

两者都可以使用:

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

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

由于sumStream是Future,因此main可以等待异步执行:它声明要使用异步功能(异步声明),然后可以使用wait停止自己的执行,直到sumStream返回。

如果不让main保持异步状态的另一种方法是,在Future中添加 .then 子句:
void main()  {
  sumStream(countStream(5)).then((x)=>print(x));
  print("after sumStream");
}

结果:
在sumStream之后
10

如您所见,通过sumStream的主传递已启动,但尚未完成,请先执行print(“sumStream”之后)。
然后主程序完成了,但是Dart知道仍有异步作业在运行,它将等待所有操作完成,因此我们可以看到结果,但是一旦Future sumStream完成。

高温超导

关于dart - 这些函数返回值如何在Dart中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59604906/

10-12 06:23