生命週期
處理函式同步執行,依註冊順序環繞在排程器核心周圍。.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。僅宣告 schema 不會自動還原自訂欄位:應像概覽的連續答對範例一樣,在複習時儲存所需的舊值,在復原時依設定的策略讀取並還原。
預覽也會為所需的候選評分執行 review 處理函式。因此不要在處理函式中寫入資料庫、傳送通知或執行其他外部操作;由應用程式儲存最後選定的複習結果。forget() 透過預設值重設卡片,沒有獨立的 forget 處理函式;連續答對範例因此會把計數歸零。