@@ -26,9 +26,21 @@ const qualityToRating = (quality) => {
2626export const calculateNextReview = ( problem , feedback ) => {
2727 try {
2828 const now = new Date ( ) ;
29- const lastReview = problem . fsrsState && problem . fsrsState . lastReview
30- ? new Date ( problem . fsrsState . lastReview )
31- : new Date ( problem . submissionTime || now . getTime ( ) ) ;
29+
30+ // 确保有一个有效的 lastReview 日期
31+ let lastReview ;
32+ if ( problem . fsrsState && problem . fsrsState . lastReview ) {
33+ lastReview = new Date ( problem . fsrsState . lastReview ) ;
34+ } else if ( problem . submissionTime ) {
35+ lastReview = new Date ( problem . submissionTime ) ;
36+ } else {
37+ lastReview = new Date ( now . getTime ( ) ) ; // 默认为昨天
38+ }
39+
40+ // 检查日期是否有效
41+ if ( isNaN ( lastReview . getTime ( ) ) ) {
42+ lastReview = new Date ( now . getTime ( ) ) ; // 如果无效,使用昨天
43+ }
3244
3345 // 如果没有 fsrsState,创建一个默认的
3446 if ( ! problem . fsrsState ) {
@@ -38,46 +50,59 @@ export const calculateNextReview = (problem, feedback) => {
3850 stability : card . stability ,
3951 difficulty : card . difficulty ,
4052 state : card . state ,
41- reps : card . reps ,
42- lapses : card . lapses
53+ reviewCount : card . reps ,
54+ lapses : card . lapses ,
55+ lastReview : + lastReview // 存储为时间戳
4356 }
4457 } ) ;
4558 }
46- let card = problem . fsrsState
59+ let card = problem . fsrsState ;
60+
61+
62+
63+ // 确保 nextReview 有效
64+ if ( ! card . nextReview || isNaN ( card . nextReview ) ) {
65+ card . nextReview = + lastReview ; // 默认为一天后
66+ }
4767
4868 const rating = qualityToRating ( feedback . quality ) ;
69+
70+ // 确保所有参数都有有效值
71+ const scheduledDays = Math . max ( 0 , Math . floor ( ( card . nextReview - card . lastReview ) / ( 1000 * 60 * 60 * 24 ) ) ) ;
72+ const elapsedDays = Math . max ( 0 , ( now . getTime ( ) - lastReview . getTime ( ) ) / ( 1000 * 60 * 60 * 24 ) ) ;
73+
4974 const result = fsrs . next ( {
5075 due : card . nextReview ,
5176 stability : card . stability ,
5277 difficulty : card . difficulty ,
53- elapsed_days : ( now . getTime ( ) - lastReview . getTime ( ) ) / ( 1000 * 60 * 60 * 24 ) ,
54- scheduled_days : Math . floor ( ( card . nextReview - card . lastReview ) / ( 1000 * 60 * 60 * 24 ) ) ,
78+ elapsed_days : elapsedDays ,
79+ scheduled_days : scheduledDays ,
5580 reps : card . reviewCount ,
5681 lapse_count : card . lapses ,
5782 state : card . state ,
58- last_review : card . lastReview || undefined ,
83+ last_review : lastReview , // 使用已经转换好的 Date 对象
5984 } , now , rating ) ;
6085
61-
6286 return {
6387 /**长期调度模式,ivl一定大于1d */
6488 nextReview : + result . card . due ,
6589 stability : result . card . stability ,
6690 difficulty : result . card . difficulty ,
6791 state : result . card . state ,
68- reps : result . card . reps ,
92+ reviewCount : result . card . reps ,
6993 lapses : result . card . lapses
7094 } ;
7195 } catch ( error ) {
7296 console . error ( 'Error in calculateNextReview:' , error ) ;
97+ const now = new Date ( ) ; // 在 catch 块中定义 now 变量
7398 return {
7499 nextReview : now . getTime ( ) + ( 24 * 60 * 60 * 1000 ) ,
75100 stability : problem . fsrsState . stability || S_MIN ,
76101 /** ref: https://github.com/open-spaced-repetition/ts-fsrs/blob/5eabd189d4740027ce1018cc968e67ca46c048a3/src/fsrs/default.ts#L20-L40 */
77102 difficulty : problem . fsrsState . difficulty || params . w [ 4 ] ,
78103 /** 长期调度下状态一定是New或Review */
79104 state : problem . fsrsState . state || State . Review ,
80- reps : ( problem . fsrsState . reviewCount || 0 ) + 1 ,
105+ reviewCount : ( problem . fsrsState . reviewCount || 0 ) + 1 ,
81106 lapses : problem . fsrsState . lapses || 0
82107 } ;
83108 }
@@ -106,7 +131,7 @@ export const updateProblemWithFSRS = (problem, feedback) => {
106131 difficulty : fsrsResult . difficulty ,
107132 stability : fsrsResult . stability ,
108133 state : fsrsResult . state ,
109- lastReview : fsrsResult . lastReview ,
134+ lastReview : now ,
110135 nextReview : fsrsResult . nextReview ,
111136 reviewCount : fsrsResult . reps ,
112137 lapses : fsrsResult . lapses ,
0 commit comments