> For AI agents: the complete documentation index is available at https://open-spaced-repetition.github.io/ts-fsrs/zh-CN/llms.txt, the full documentation bundle is available at https://open-spaced-repetition.github.io/ts-fsrs/zh-CN/llms-full.txt.

# 生命周期

处理函数同步执行，按注册顺序环绕在调度器核心周围。`.use(a, b)` 与 `.use(a).use(b)` 的注册顺序相同，且每次调用 `use` 都返回新的定义，不改动原定义。调度器核心位于调用链中间，因此 `next()` 之前的代码准备操作，之后的代码读取结果。

## 环绕核心的顺序

对于 `.use(a, b)`，调用顺序如下：

```text
a: next() 前
  b: next() 前
    调度器核心
  b: next() 后
a: next() 后
```

调用一次 `next()`，让正常调度流程继续执行。在它之前设置 `ctx.candidate.desiredRetention[ctx.input.grade]` 等计算输入，在它之后读取或调整计算结果。复习阶段的 `ctx.scheduledDays` 表示以天为单位的间隔。所有处理函数结束后，调度器再通过配置的 chrono 计算到期时间，并校验最终结果。

策略相互作用时，顺序会影响结果：scheduled days 应放在间隔策略之前，才能在调用链返回时记录最终值；学习步骤应放在最大间隔和单调间隔之前，以保留显式步骤的等待时间。Leech 应放在那些会于 `next()` 后设置 `scheduleStatus` 的处理函数之前，让暂停状态最后生效。[内置策略](https://open-spaced-repetition.github.io/ts-fsrs/zh-CN/guide/middleware/built-in.md) 列出了每个策略以及 `DefaultScheduler` 的排列顺序。

## 复习与撤销

撤销会按相同的注册顺序执行独立的 rollback 处理函数。它可以读取 `ctx.config`、`ctx.input.card` 和 `ctx.input.revlog`，结果只写入 `ctx.result.card`。仅声明 schema 不会自动恢复自定义字段：应像[概览](https://open-spaced-repetition.github.io/ts-fsrs/zh-CN/guide/middleware/index.md)的连续答对示例一样，在复习时保存所需旧值，在撤销时按配置的策略读取并恢复。

预览也会为所需的候选评分执行 review 处理函数。因此不要在处理函数中写数据库、发通知或执行其他外部操作；由应用保存最终选定的复习结果。`forget()` 通过默认值重置卡片，没有单独的 forget 处理函数；连续答对示例因此会把计数重置为零。
