diff --git a/javascripts/teamodoro.js b/javascripts/teamodoro.js index 00cbf75..3dd4f8a 100644 --- a/javascripts/teamodoro.js +++ b/javascripts/teamodoro.js @@ -6,8 +6,8 @@ Teamodoro = { start: function() { this.clock = SVG("canvas").clock("100%"); this.updateClock(); - setInterval(this.updateClock.bind(this), 500); - setInterval(this.displayRandomGif.bind(this), 30 * 1000); + this.safeSetInterval(this.updateClock.bind(this), 500); + this.safeSetInterval(this.displayRandomGif.bind(this), 30 * 1000); if (this.inBreak()) this.displayRandomGif(); @@ -40,6 +40,17 @@ Teamodoro = { return new Date((new Date()).valueOf() + this.timeDifference); }, + safeSetInterval: function(callback, timeout, drift) { + let correctedTimeout = timeout + (drift ?? 0); + correctedTimeout = Math.max(correctedTimeout, 0); + const expectedDate = Date.now() + correctedTimeout; + setTimeout(() => { + callback(); + const drift = Date.now() - expectedDate; + this.safeSetInterval(callback, timeout, drift); + }, correctedTimeout); + }, + displayRandomGif: function() { if (!this.inBreak()) return;