From f47952042c5dfc6b9cc6d7b9a4ceeb82f26b4527 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 19 May 2015 01:41:06 +0200 Subject: [PATCH] Add WoltLab/WCF/Timer/Repeating --- wcfsetup/install/files/js/WCF.js | 7 +- .../install/files/js/WoltLab/WCF/Template.js | 2 +- .../files/js/WoltLab/WCF/Timer/Repeating.js | 70 +++++++++++++++++++ 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 wcfsetup/install/files/js/WoltLab/WCF/Timer/Repeating.js diff --git a/wcfsetup/install/files/js/WCF.js b/wcfsetup/install/files/js/WCF.js index 6a76186847..ce88b23550 100755 --- a/wcfsetup/install/files/js/WCF.js +++ b/wcfsetup/install/files/js/WCF.js @@ -1962,12 +1962,7 @@ WCF.Clipboard = { }; /** - * Provides a simple call for periodical executed functions. Based upon - * ideas by Prototype's PeriodicalExecuter. - * - * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/periodical_executer.js - * @param function callback - * @param integer delay + * @deprecated Use WoltLab/WCF/Timer/Repeating */ WCF.PeriodicalExecuter = Class.extend({ /** diff --git a/wcfsetup/install/files/js/WoltLab/WCF/Template.js b/wcfsetup/install/files/js/WoltLab/WCF/Template.js index 2ce9afd4d9..ea28a33d12 100644 --- a/wcfsetup/install/files/js/WoltLab/WCF/Template.js +++ b/wcfsetup/install/files/js/WoltLab/WCF/Template.js @@ -42,7 +42,7 @@ define(['./Template.grammar', './StringUtil', 'Language'], function(parser, Stri + "v.__wcf = window.WCF; v.__window = window;\n" + "return " + template; - this.fetch = new Function("StringUtil", "Language", "v", template).bind(null, StringUtil, Language); + this.fetch = new Function("StringUtil", "Language", "v", template).bind(undefined, StringUtil, Language); } catch (e) { console.debug(e.message); diff --git a/wcfsetup/install/files/js/WoltLab/WCF/Timer/Repeating.js b/wcfsetup/install/files/js/WoltLab/WCF/Timer/Repeating.js new file mode 100644 index 0000000000..baa94f72b2 --- /dev/null +++ b/wcfsetup/install/files/js/WoltLab/WCF/Timer/Repeating.js @@ -0,0 +1,70 @@ +/** + * Provides an object oriented API on top of `setInterval`. + * + * @author Tim Duesterhus + * @copyright 2001-2015 WoltLab GmbH + * @license GNU Lesser General Public License + * @module WoltLab/WCF/Timer/Repeating + */ +define([], function() { + "use strict"; + + /** + * Creates a new timer that executes the given `callback` every `delta` milliseconds. + * It will be created in started mode. Call `stop()` if necessary. + * The `callback` will be passed the owning instance of `Repeating`. + * + * @constructor + * @param {function(Repeating)} callback + * @param {int} delta + */ + function Repeating(callback, delta) { + if (typeof callback !== 'function') { + throw new TypeError("Expected a valid callback as first argument."); + } + if (delta < 0 || delta > 86400 * 1000) { + throw new RangeError("Invalid delta " + delta + ". Delta must be in the interval [0, 86400000]."); + } + + // curry callback with `this` as the first parameter + this._callback = callback.bind(undefined, this); + + this._delta = delta; + this._timer = undefined; + + this.restart(); + }; + Repeating.prototype = { + /** + * Stops the timer and restarts it. The next call will occur in `delta` milliseconds. + */ + restart: function() { + this.stop(); + + this._timer = setInterval(this._callback, this._delta); + }, + + /** + * Stops the timer. It will no longer be called until you call `restart`. + */ + stop: function() { + if (this._timer !== undefined) { + clearInterval(this._timer); + this._timer = undefined; + } + }, + + /** + * Changes the `delta` of the timer and `restart`s it. + * + * @param {int} delta New delta of the timer. + */ + setDelta: function(delta) { + this._delta = delta; + + this.restart(); + } + }; + + return Repeating; +}); -- 2.20.1