题目
使用 async/await 处理 Future 的基本流程
信息
- 类型:问答
- 难度:⭐
考点
Future概念, async/await语法, 错误处理
快速回答
使用 async/await 处理 Future 的基本步骤:
- 在函数声明前添加
async关键字 - 在异步操作前使用
await等待结果 - 用 try-catch 捕获异步错误
- 返回的 Future 类型会自动包装
原理说明
Dart 的异步编程核心是 Future,表示一个可能尚未完成的异步操作结果。async/await 语法糖让异步代码具有同步代码的可读性:
async:标记函数为异步函数,自动将返回值包装为 Futureawait:暂停当前函数执行,等待 Future 完成,返回实际结果- 执行权交还给事件循环,避免阻塞主线程
代码示例
// 定义异步函数
Future<String> fetchUserData() async {
try {
// 模拟网络请求
String data = await Future.delayed(
Duration(seconds: 2),
() => '用户数据: Alice, 25岁'
);
return data; // 自动包装为 Future<String>
} catch (e) {
print('请求失败: $e');
return '默认数据';
}
}
// 调用
void main() async {
print('开始获取数据');
String result = await fetchUserData();
print('获取结果: $result'); // 输出: 获取结果: 用户数据: Alice, 25岁
}最佳实践
- 始终用 try-catch 处理
await可能抛出的错误 - 为异步函数明确声明返回值类型(如
Future<String>) - 避免在 UI 线程使用同步阻塞操作(如
Future.wait()替代多个 await)
常见错误
- 忘记添加 async:导致无法使用 await
- 遗漏 await:直接返回 Future 对象而非实际值
- 忽略错误处理:未捕获异常导致程序崩溃
- 误用同步代码:在 async 函数中执行耗时同步操作阻塞事件循环
扩展知识
- Future 状态:uncompleted(未完成)/completed(完成含值或错误)
- 事件循环:Dart 在 await 时释放线程处理其他事件
- 链式处理:
future.then((v) => ...).catchError(...)是 await 的底层实现 - Isolate:CPU 密集型任务应使用 Isolate 而非 async