侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用 async/await 处理 Future 的基本流程

2025-12-14 / 0 评论 / 4 阅读

题目

使用 async/await 处理 Future 的基本流程

信息

  • 类型:问答
  • 难度:⭐

考点

Future概念, async/await语法, 错误处理

快速回答

使用 async/await 处理 Future 的基本步骤:

  1. 在函数声明前添加 async 关键字
  2. 在异步操作前使用 await 等待结果
  3. 用 try-catch 捕获异步错误
  4. 返回的 Future 类型会自动包装
## 解析

原理说明

Dart 的异步编程核心是 Future,表示一个可能尚未完成的异步操作结果。async/await 语法糖让异步代码具有同步代码的可读性:

  • async:标记函数为异步函数,自动将返回值包装为 Future
  • await:暂停当前函数执行,等待 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