From 327fdb925ce7c9d4755271e9b9f4881e8d499a25 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 17 Jul 2021 23:35:24 -0600 Subject: [PATCH] add cron to loop --- public/mytinytodo.js | 4 ++-- server/ajax/ajax.go | 14 +++++++++++--- server/ajax/form/cron.go | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/public/mytinytodo.js b/public/mytinytodo.js index 587ed6c..6ec18f5 100755 --- a/public/mytinytodo.js +++ b/public/mytinytodo.js @@ -1542,8 +1542,8 @@ function getGetParamValue(url, paramName) { prio: form.prio.value, tags: form.tags.value, duedate: form.duedate.value, - loop: form.loop.value - cron: form.cron.value + loop: form.loop.value, + cron: form.cron.value, }, function (json) { if (!parseInt(json.total)) return; form.task.value = ''; diff --git a/server/ajax/ajax.go b/server/ajax/ajax.go index 5085a23..9c44414 100755 --- a/server/ajax/ajax.go +++ b/server/ajax/ajax.go @@ -90,12 +90,17 @@ func (a *Ajax) Async() { var err error nextDue := time.Now().Add(config.Loop) c := time.NewTicker(config.Loop) + c2 := time.NewTicker(config.Loop) for { + c.Stop() + c.Reset(config.Loop) + c2.Stop() + c2.Reset(time.Until(nextDue)) + log.Println("next loop at", time.Until(nextDue), "or", config.Loop) select { case <-c.C: - case <-time.After(time.Until(nextDue)): + case <-c2.C: } - log.Println("loop tasks") nextDue, err = a.loopTasks() if err != nil { log.Println("failed to loop tasks", err) @@ -125,7 +130,10 @@ func (a *Ajax) loopTasks() (time.Time, error) { } nextLoopTrigger := task.Completed.Add(task.Loop) if task.Loop == 0 { - nextLoopTrigger = task.Cron.Next() + nextLoopTrigger2 := task.Cron.Next(task.Completed) + if nextLoopTrigger2.Before(nextLoopTrigger) { + nextLoopTrigger = nextLoopTrigger2 + } } if time.Now().Before(nextLoopTrigger) { if nextLoopTrigger.Before(nextDue) { diff --git a/server/ajax/form/cron.go b/server/ajax/form/cron.go index cefa9b3..38267ac 100644 --- a/server/ajax/form/cron.go +++ b/server/ajax/form/cron.go @@ -8,10 +8,10 @@ import ( type Cron string -func (c Cron) Next() time.Time { +func (c Cron) Next(since time.Time) time.Time { schedule, err := cron.ParseStandard(string(c)) if err != nil { return time.Time{} } - return schedule.Next(time.Now()) + return schedule.Next(since) }