ライフサイクル
ハンドラは同期的に実行され、登録順にスケジューラのコアを囲みます。.use(a, b) と .use(a).use(b) の登録順序は同じで、use を呼ぶたびに新しい定義を返し、元の定義は変わりません。スケジューラのコアはチェーンの中央にあるため、next() の前のコードは操作を準備し、後のコードは結果を読み取ります。
コアを囲む順序
.use(a, b) の場合の呼び出し順序は次のとおりです。
通常のスケジューリング処理を続けるには、next() を一度呼び出します。ctx.candidate.desiredRetention[ctx.input.grade] などの計算入力は呼び出し前に設定し、計算結果の確認や調整は呼び出し後に行います。復習時の ctx.scheduledDays は日単位の間隔です。すべてのハンドラが終了した後、スケジューラは設定された chrono で期限を計算し、最終結果を検証します。
ポリシーを組み合わせる際は順序が重要です。scheduled days を間隔ポリシーより前に登録すると、呼び出しから戻る際に最終値を記録できます。明示的な学習ステップの待ち時間を保つには、学習ステップを最大間隔と単調間隔より前に置きます。Leech は next() の後に scheduleStatus を設定するハンドラより前に置き、停止状態が最後に適用されるようにします。組み込みポリシー に各ポリシーと DefaultScheduler の順序をまとめています。
復習とロールバック
ロールバックでは、専用の rollback ハンドラを同じ登録順序で実行します。ctx.config、ctx.input.card、ctx.input.revlog を読み取ることができ、結果は ctx.result.card にのみ書き込みます。スキーマを宣言するだけでは独自フィールドは復元されません。概要 の連続正解カウンタの例のように、復習時に必要な変更前の値を保存し、ロールバック時に設定されたポリシーに従って読み戻してください。
プレビューも候補となる評価に対して review ハンドラを実行します。ハンドラ内でデータベースへの書き込みや通知などの外部操作を行わず、確定した復習結果をアプリケーション側で保存してください。forget() は専用ハンドラではなくデフォルト値を使ってカードをリセットします。そのため連続正解カウンタの例ではカウンタがゼロになります。