/* Page prose (ja) */
"AsyncSeqWrappingUp" = "# まとめ\n\n非同期シーケンスは、*時間をかけて*到着する値のためのツールで、ブロックする代わりに値と値の間で中断する `for await` ループで消費します。繰り返し現れる危険は、決して終わらない stream、あるいは決して後始末をしない stream です。以下のライフサイクルのポイントを見据えておけば、stream は行儀よくふるまいます。\n\n* **非同期シーケンス**は値を*時間をかけて*届けます。`Task` の中で `for await` でループしましょう。これはブロックする代わりに要素と要素の間で中断します。ただの配列に対しては、普通の `for` ループが正しく、より明快です。\n* **`AsyncStream`** はコールバック/タイマー/イベントのソースを非同期シーケンスに変えます。`continuation.yield(_:)` が発し、`continuation.finish()` が終了させます。落とし穴: その `finish()`（あるいはエラー、あるいはキャンセル）がなければ、消費側のループは決して止まりません。\n* **`onTermination`** は stream が終わるときに、正常であれ早期であれ、一度だけ実行されます。ですから、ここでタイマーをキャンセルし、リソースを解放します。省けば、バックグラウンドのプロデューサーがリークします。\n* **消費側のタスクをキャンセルすること**（または `break` で抜けること）は、次のサスペンションで消費を止めます。次の値を待つこと*こそが*キャンセルのチェックです。\n* **`AsyncThrowingStream`** は失敗を加えます。`finish(throwing:)` で終了し、`do-try-catch` の中で `for try await` で消費します。\n* これは、繰り返し呼ばれる delegate やマルチコールバックのパターンに代わるモダンな置き換えです。\n\n---\n\n## 次は\n\n**[Continuation](Continuations.playgroundchapter/Overview)**: *単一の*昔ながらのコールバック API を 1 つのきれいな `await` へ橋渡しする方法。`AsyncStream` の隣にある、欠けていたピースです。\n\n[前へ](@previous)  |  7 / 7 ページ";
