/* Page prose (zh-Hans) */
"AsyncSeqWrappingUp" = "# 小结\n\n异步序列是用于*随时间*到来的数值的工具，用一个在它们之间挂起而非阻塞的 `for await` 循环来消费。反复出现的危险是一个永不结束、或永不清理自己的流。把下面这些生命周期要点放在眼前，流就会表现良好。\n\n* 一个**异步序列***随时间*递送数值；在一个 `Task` 里用 `for await` 来循环它，它会在元素之间挂起而非阻塞。对一个普通数组，一个普通的 `for` 循环才是正确且更清晰的。\n* **`AsyncStream`** 把一个回调/计时器/事件的来源变成异步序列：`continuation.yield(_:)` 发出，`continuation.finish()` 结束它，还有个陷阱：没有那个 `finish()`（或一个错误，或一次取消），消费者的循环永远不会停。\n* **`onTermination`** 会在流结束时运行一次，无论是正常还是提前，所以它就是你取消计时器、释放资源的地方；跳过它，一个后台生产者就会泄漏。\n* **取消消费的任务**（或 `break` 出去）会在下一个挂起点停止消费；await 下一个值*就是*取消检查。\n* **`AsyncThrowingStream`** 加入了失败：用 `finish(throwing:)` 来结束，在 `do-try-catch` 里用 `for try await` 来消费。\n* 这是对反复调用 delegate 与多回调模式的现代替代。\n\n---\n\n## 接下来\n\n**[Continuation](Continuations.playgroundchapter/Overview)**：如何把一个*单个*旧式回调 API 桥接进一个干净的 `await`，`AsyncStream` 旁边缺失的那一块。\n\n[上一页](@previous)  |  第 7 / 7 页";
