Dart面试题更新 2026-08-05

在 Dart 语言中,async 和 await 这两个关键字应该怎样被应用?它们背后运行的机制究竟是怎样的?

编码实现技术原理Dart

考察说明

考查候选人是否真正理解 Dart 异步编程中 async/await 的语法规则、执行流程及其底层的事件循环机制。

回答思路

  1. 【回答框架 1】async 关键字用于标记一个函数为异步函数,其返回值会被自动包装为 Future 对象。await 关键字只能在 async 函数内使用,用于挂起当前函数的执行,等待一个 Future 完成并返回其结果。
  2. 【回答框架 2】当执行到 await 表达式时,当前函数会立即返回一个未完成的 Future,并且函数的剩余部分会被注册为回调,等待所 await 的 Future 完成后继续执行。这不会阻塞事件循环,使得其他任务(如 IO、定时器)可以继续运行。
  3. 【回答框架 3】在底层,Dart 事件循环是单线程模型,Future 和 Stream 都依赖于事件循环的任务队列。async/await 只是语法糖,编译器将其转换为生成器或状态机,本质上是基于回调的,但提供了更线性的编程体验。
  4. 【回答框架 4】需要注意 await 的表达式可以是 Future、普通值或者实现了 FutureOr 的表达式。如果 await 的表达式不是 Future,则会被包装为已完成的 Future。
  5. 【回答框架 5】异常处理方面,async 函数内抛出异常会导致返回的 Future 以 error 状态完成,可以通过 try-catch 捕获,或者通过 catchError 处理。
  6. 【关键点 1】async 函数返回 Future,await 只能用于 async 上下文,用于挂起函数执行直至 Future 完成。
  7. 【关键点 2】await 不会阻塞事件循环,而是让出执行权,等待异步结果后继续。
  8. 【关键点 3】async/await 本质是基于回调的语法糖,底层由事件循环驱动。
  9. 【关键点 4】await 可等待 Future、Stream 或其他值,非 Future 值会被包装。
  10. 【关键点 5】async 函数中的未捕获异常会转化为返回的 Future 的 error。