dart - 基本的异步/等待模式?
问题描述
我试图找出 Dart 中的异步/等待问题。我正在调用一个简短的 http 获取序列并希望等待它们。我创建了这个示例代码来演示这个问题。
我希望看到“开始测试”,然后按顺序开始每个下载。然后每个下载都会以随机顺序完成,然后我会看到“结束测试”。但是,我什至在任何下载开始之前就看到了“结束测试”。
请帮助我理解我做错了什么。
import 'dart:async';
import 'package:http/http.dart' as http;
class AsyncTest {
final _resourceList = [
{
'name': 'Test 1',
'url': 'https://jsonplaceholder.typicode.com/posts'
},
{
'name': 'Test 2',
'url': 'https://jsonplaceholder.typicode.com/comments'
},
{
'name': 'Test 3',
'url': 'https://jsonplaceholder.typicode.com/albums'
},
{
'name': 'Test 4',
'url': 'https://jsonplaceholder.typicode.com/photos'
},
{
'name': 'Test 5',
'url': 'https://jsonplaceholder.typicode.com/users'
},
];
void beginTest() async {
print('begin test');
await getAll();
print('end test');
}
Future<void> getAll() async {
_resourceList.forEach((resource) async {
print('begin ${resource['name']}');
final response = await http.get(resource['url']);
print('end ${resource['name']}');
});
}
}
这是输出。
flutter: begin test
flutter: end test
flutter: begin Test 1
flutter: begin Test 2
flutter: begin Test 3
flutter: begin Test 4
flutter: begin Test 5
flutter: end Test 1
flutter: end Test 5
flutter: end Test 3
flutter: end Test 2
flutter: end Test 4
解决方案
您await
在内部的调用getAll()
允许事件循环处理不同的路径。所以是的,所有早期的事情(开始......)首先出现,而后来的事情(结束......)以明显随机的顺序出现是有道理的。这是异步编程的内在本质。
推荐阅读
- locust - 将相同的值传递给蝗虫中的多个任务
- pandas - 将带有 None;s 的 pandas 数据帧转换为 spark 数据帧
- spring - 使用网关和 Spring Security OAuth 保护 rest api 的最佳实践
- google-cloud-firestore - geofirestore 查询文档快照
- c# - 从 Oracle 12 升级到 19c 后出现“ORA-03146:TTC 字段的缓冲区长度无效”
- html - 如何从大栏的顶行开始写作 [HTML/CSS]
- css - 通过 Angular 中的 API 动态导入 Css
- java - 选择硒
- node.js - 尝试将文件从 lambda tmp 文件夹上传到 s3 存储桶
- python - 如何在 Python 的 Tkinter 模块中获取当前单元格的高度和宽度