Home
>
Archives
>
Future
Future
Publish:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| void futureStateDemo() async {
print('=== Future的状态和缓存 ===');
// 创建一个Future
var future = Future.delayed(Duration(seconds: 2), () {
print('Future计算完成');
return 42; // 计算结果
});
// 状态1: Uncompleted(未完成) - 0~2秒
print('创建后立即检查:');
print(' 是否完成? ${future is Future<int>}'); // true,但还未计算
print(' 当前时间: ${DateTime.now()}');
// 等3秒,让Future完成
await Future.delayed(Duration(seconds: 3));
// 状态2: Completed with value(已完成,有值) - 2秒后
print('\n3秒后检查:');
var value = await future; // ⭐ 这里是从缓存取值!
print(' 取值: $value');
print(' 再次取值: ${await future}'); // 再次从缓存取
// 状态3: Completed with error(已完成,有错误)
var errorFuture = Future.error(Exception('测试错误'));
try {
await errorFuture;
} catch (e) {
print('\n错误Future: $e');
}
// 错误也被缓存!
try {
await errorFuture; // 同样的错误
} catch (e) {
print('再次获取同样的错误: $e');
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| void main() async {
print('开始');
// 并行启动所有Future
var future1 = fetchData(1); // 立即启动,不等待
var future2 = fetchData(2); // 立即启动,不等待
var future3 = fetchData(3); // 立即启动,不等待
var time = DateTime.now();
// 等待所有Future完成
var data1 = await future1;
var data2 = await future2;
var data3 = await future3;
print('结果: $data1, $data2, $data3');
print('总耗时: ${(DateTime.now()).difference(time).inSeconds}秒');
}
Future<String> fetchData(int index) {
print('开始获取数据$index, 当前时间: ${DateTime.now()}');
return Future.delayed(Duration(seconds: 10), () {
// 模拟网络请求
return '从服务器获取的数据$index';
// 抛出异常模拟错误
// throw Exception('网络错误');
});
}
|
输出结果:
1
2
3
4
5
6
7
8
| 开始
开始获取数据1, 当前时间: 2025-12-03 20:30:52.643714
开始获取数据2, 当前时间: 2025-12-03 20:30:52.655745
开始获取数据3, 当前时间: 2025-12-03 20:30:52.656121
结果: 从服务器获取的数据1, 从服务器获取的数据2, 从服务器获取的数据3
总耗时: 10秒
Exited.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| void main() async {
print('1. main开始');
// 这3个Future立即进入"微任务队列"
var future1 = fetchData(1);
var future2 = fetchData(2);
var future3 = fetchData(3);
print('2. Future已创建,但未等待');
// 没有await,main函数继续执行
print('3. main继续执行');
// main函数结束,但程序不会立即退出
// 因为还有未完成的Future
print('4. main结束');
// 注意:即使main函数结束,Future仍在后台执行
// 但程序会等待所有未完成的Future吗?看下面的测试
}
Future<String> fetchData(int index) {
print('开始获取数据$index');
return Future.delayed(Duration(seconds: 2), () {
print('数据$index完成'); // 这个还会执行吗?
return '数据$index';
});
}
|
输出结果:
1
2
3
4
5
6
7
8
9
10
11
12
| 1. main开始
开始获取数据1
开始获取数据2
开始获取数据3
2. Future已创建,但未等待
3. main继续执行
4. main结束
数据1完成
数据2完成
数据3完成
Exited.
|
声明: 本文采用 BY-NC-SA 授权。转载请注明转自: Ding Bao Guo