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/