什么是 Future
?
Future
就像一个 “承诺”:我现在不能给你结果,但未来某个时间点一定给你(成功或失败)。
最简单的例子
// 模拟异步操作:2秒后返回"Hello, Future!"
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () => "Hello, Future!");
}
void main() {
print("开始执行...");
// 方式一:使用 .then() 处理结果
fetchData().then((result) {
print("接收到结果: $result"); // 2秒后打印
});
print("主线程继续执行,不会等待"); // 立即打印
}
// 输出顺序:
// 1. 开始执行...
// 2. 主线程继续执行,不会等待
// 3. (2秒后) 接收到结果: Hello, Future!
用 async/await
简化代码
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () => "Hello, Async/Await!");
}
void main() async {
print("开始执行...");
// 方式二:使用 async/await (更简洁)
String result = await fetchData(); // 等待Future完成
print("接收到结果: $result");
print("主线程继续执行"); // 2秒后才会执行这行
}
特性 | 不用 async/await (.then() ) |
用 async/await |
---|---|---|
代码结构 | 嵌套回调(Callback Hell) | 线性结构,类似同步代码 |
错误处理 | 需要 .catchError() 链 |
可以用 try/catch 块 |
执行顺序 | 回调函数在 Future 完成后才会被加入事件队列 | 代码逻辑上是 “等待”,但实际不会阻塞主线程 |
连续异步操作对比
不用 async/await
(嵌套回调)
void main() {
fetchUserData().then((user) {
return fetchUserPosts(user.id); // 返回第二个 Future
}).then((posts) {
return savePostsToCache(posts); // 返回第三个 Future
}).then((_) {
print("全部完成");
}).catchError((error) {
print("错误: $error");
});
}
用 async/await
(线性结构)
void main() async {
try {
User user = await fetchUserData();
List<Post> posts = await fetchUserPosts(user.id);
await savePostsToCache(posts);
print("全部完成");
} catch (error) {
print("错误: $error");
}
}
Future的并行和串行
核心区别:启动时机不同
串行执行(代码 1):
// 第一步:启动任务1 → 等待2秒 → 任务1完成
final result1 = await fetchData1(); // 2秒后才会继续执行下一行
// 第二步:启动任务2 → 等待2秒 → 任务2完成
final result2 = await fetchData2(); // 再等2秒
并行执行(代码 2):
// 第一步:同时启动任务1和任务2
final future1 = fetchData1(); // 立即启动任务1
final future2 = fetchData2(); // 立即启动任务2
// 第二步:分别等待两个任务完成
// 由于两个任务同时进行,这里只需要等2秒
final result1 = await future1; // 2秒后完成
final result2 = await future2; // 立即完成(因为已经等了2秒)