dart - 这些函数返回值在 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 { //...
现在,这是如何工作的?我在这里有点困惑。
提前致谢!阿克塞尔。
解决方案
对于您的第一个示例, 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 完成。
高温高压
推荐阅读
- excel - 有没有办法仅在设定的时间后运行 Worksheet_SelectionChange() Sub?
- r - 仅将括号与 R 中的文本和数字匹配
- c++ - 使用参数包参数初始化 `std::array`
- docker - 使用 docker 在 gitea 上 ssh
- google-apps-script - 捕获 Google 电子表格的删除和复制工作表事件
- python - 有没有办法检查与原始脚本不同的脚本中存在的变量?
- ionic-framework - Firebase 是否适用于具有离线模式的 pwa?
- javascript - 如何在 Angular 6 中处理来自后端的多个异步请求?
- python - 在 windows7 上为 python3 安装 METIS 库
- swift - FirebaseAuth,来自提供商的 JWT 在调用 updateEmailUpdate 之前不包含电子邮件地址