/* Page prose (zh-Hans) */
"WrappingUp" = "# 小结\n\ncontinuation 就是那个让现代世界能对一个老式回调 API `await` 的适配器：在 `await` 处挂起，在回调触发时恢复。一切都建立在一条法则之上，在每条路径上**恰好恢复一次**，而下面大多数要点都是这条法则从不同角度看到的样子。\n\n* **continuation** 把一个回调/completion/delegate API 桥接进 `async`/`await`：在 `await` 处挂起，在回调触发时恢复。\n* `withCheckedContinuation` 用于总会成功的回调；`withCheckedThrowingContinuation`（外加 `resume(throwing:)`）用于可能失败的回调。`resume(with:)` 一行就能拆开一个 `Result`。\n* 黄金法则：在每条路径上**恰好恢复一次**；追踪每个分支。零次恢复 → 一场无声的卡死；两次 → 一次崩溃。对一个可能重复的回调，在第一次恢复之后把存好的 continuation 置空来加以防范。\n* **Checked** continuation 两者都能抓住：它们在双重恢复时触发陷阱，在泄漏的（从未恢复的）continuation 上发出警告；别去消掉那条警告，而且在学习阶段优先用 checked 而不是 `withUnsafeContinuation`。\n* 用一个在自己的 delegate 方法里恢复的小适配器来桥接一个**一次性 delegate**，并让一个指向它的强引用一直存活到它恢复为止，否则一个 `weak` delegate 可能被提前释放，从而泄漏 continuation。\n* continuation 是一次性、用完即止的。对于反复触发的回调，用[AsyncSequence 与 AsyncStream](AsyncSequence%20and%20AsyncStream.playgroundchapter/Overview) 这一章里的 `AsyncStream`。\n\n---\n\n## 接下来\n\n**[Task Groups](Task%20Groups.playgroundchapter/Overview)**：现在单个异步调用已经很容易了，你要如何一次运行*许多*个，并安全地、并行地收集所有结果？\n\n[上一页](@previous)  |  第 8 / 8 页";
