/* Page prose (zh-Hans) */
"Overview" = "# Continuation\n\n到现在为止，`await` 已经让你觉得自然了，但外面大多数代码并不会说它。前面章节里那些经典的 completion handler、每一次 `DispatchQueue` 跳转、每一个\"稍后\"触发的 delegate 方法（还有你在真实项目中会遇到的无数系统和 SDK API）都是**回调** API，而不是异步的。你没法在 `fetchThing { ... }` 上撒一点 `await` 就指望它能行。**continuation** 就是官方的适配器：它让你把这些老式回调 API 包装起来，好让外部世界能用一个干净的 `await` 来调用它。本章讲的就是如何亲手构建这个适配器。\n\n---\n\n## 你将学到\n\n* **continuation** 是什么，以及为什么它是从回调通往 `await` 的桥梁。\n* `withCheckedContinuation`：挂起一个异步函数，运行一个回调 API，并在回调触发时**恢复**。\n* `withCheckedThrowingContinuation` 用于可能失败的 API，同时包装 `Result` 和经典的 `(value, error)` 形态。\n* 你永远不能打破的一条规则：**恰好恢复一次**，以及\"checked\" continuation 如何在你失手时抓住你。\n* 如何把一个 **delegate** 风格的一次性回调桥接成一次异步调用。\n\n---\n\n## 你需要的桥梁\n\n问题出在这里的错配。一个异步函数从上到下推进，并在每个 `await` 处**挂起**，把线程交还回去，直到它的结果就绪。回调 API 根本不返回结果：它交给你一个闭包，然后在**稍后**从它完成的任何地方调用这个闭包。两个不同的世界。\n\n**continuation** 是一个值，它代表\"那个被挂起的异步函数的剩余部分，正等着被交给一个结果\"。你拿到一个 continuation，把它存起来，调用你那个老式回调 API，当回调触发时，你就用这个值**恢复**这个 continuation。这次恢复就是把异步函数重新唤醒的东西。\n\n形态总是一样的：\n\n```swift\nfunc modernVersion() async -> Result {\n    await withCheckedContinuation { continuation in\n        oldCallbackAPI { value in                   // the callback fires later...\n            continuation.resume(returning: value)   // ...and wakes us up\n        }\n    }\n}\n```\n\n`await withCheckedContinuation { ... }` 这次调用就在那里**挂起**。在*某个人*调用 `continuation.resume(...)` 之前，它不会返回。你传入的闭包会立即运行（那正是你启动老式 API 的地方），但 `await` 本身会停驻，直到恢复落地。\n\n在下一页，我们会构建一个真正的 continuation，看着它挂起再恢复。\n\n第 1 / 8 页  |  [下一页: 挂起，然后恢复](@next)";
