/* Page prose (zh-Hans) */
"ClassicModelTaxes" = "# 经典模型，以及它收取的税\n\n经典模型里的一切都有着同一种形态：你启动某项工作，交给它一个**闭包**（一个 completion handler）*稍后*运行，然后就往下走。那个闭包正是经典模型悄悄向你收费的接缝。有五笔费用一次又一次地出现：\n\n* **到处都是 completion handler。**  \n每个异步步骤都以调用*你的*闭包结束。异步调用之后没有任何东西会像普通一行那样接着运行；它统统得住在 handler *内部*。\n* **厄运金字塔。**  \n当步骤 B 需要步骤 A 的结果时，B 的调用就写进 A 的 handler 里。再加上步骤 C，你就又嵌套一层。代码不断向右挪。\n* **无法使用 `throws` 的错误。**  \ncompletion handler 不是一个你能 `return` 的函数，所以你也无法 `throw`。错误只能作为值来传递，而你必须手动把它们路由给每一个调用方。\n* **忘了回调。**  \n在*某些*路径上（一个提前的 `return`、一个错误分支），很容易忘记调用那个 completion。于是调用方就永远等下去，没有任何崩溃来指出这个错误。\n* **忘了跳回主线程。**  \n结果到达时是在一个后台队列上。从那里去碰 UI，你就得到一个只*偶尔*出现的 bug。你必须记得手动跳回主线程。\n\n你在 [Operation 的依赖与取消](Operation%20Dependencies%20and%20Cancellation.playgroundchapter/Overview) 这一章里见识了手动记账的最后一部分：在 operation 之间连接依赖、把一个取消标志穿过每一个 operation、在恰当的时机检查它。很强大，但全都得靠你。让我们看看这些税如何在一个小任务里堆积起来。\n\n[上一页](@previous)  |  第 2 / 6 页  |  [下一页: 三步完成的任务](@next)";
