| <!DOCTYPE html> |
| <html> |
| <!-- |
| Copyright 2010 The Closure Library Authors. All Rights Reserved. |
| |
| Use of this source code is governed by the Apache License, Version 2.0. |
| See the COPYING file for details. |
| --> |
| <head> |
| <title>goog.Timer, goog.async.Throttle goog.async.Delay</title> |
| <script src="../base.js"></script> |
| |
| <script> |
| goog.require('goog.async.Delay'); |
| goog.require('goog.async.Throttle'); |
| goog.require('goog.Timer'); |
| goog.require('goog.dom'); |
| </script> |
| |
| <link rel="stylesheet" href="css/demo.css"> |
| <style> |
| .userStatus { |
| font-style: italic; |
| font-weight: bold; |
| } |
| </style> |
| </head> |
| <body> |
| <h1>A Collection of Time Based Utilities</h1> |
| <h2>goog.async.Delay</h2> |
| <p>An action can be invoked after some delay.</p> |
| Delay (seconds): <input size="2" type="text" id="delaySeconds" value="2"> |
| <button onclick="doDelay()">Start Delay</button> |
| <button onclick="doReset()">Restart Delay</button> |
| <br /> |
| Delay Status: <span class="userStatus" id="delayStatus">Not Set</span> |
| |
| <h2>goog.async.Throttle</h2> |
| A throttle prevents the action from being called more than once per time |
| interval. |
| <br /> |
| 'Create' the Throttle, then hit the 'Do Throttle' button a lot |
| of times. Notice the number of 'Hits' increasing with each button press. |
| <br /> |
| The action will be invoked no more than once per time interval. |
| <p> |
| Throttle interval (seconds): |
| <input size="2" type="text" id="throttleSeconds" value="2"> |
| <button onclick="doThrottleStart()">Create Throttle</button> |
| <button onclick="doThrottle()">Do Throttle</button> |
| <br /> |
| Throttle Hits: <span class="userStatus" id="throttleHits"></span> |
| <br /> |
| Throttle Action Called: <span class="userStatus" id="throttleStatus"></span> |
| </p> |
| <h2>goog.Timer</h2> |
| A timer can be set up to call a timeout function on every 'tick' of the timer. |
| <p> |
| Timer interval (seconds): |
| <input size="2" type="text" id="timerSeconds" value="1"> |
| <button onclick="doTimerStart()">Start Timer</button> |
| <button onclick="doTimerStop()">Stop Timer</button> |
| <button onclick="doTimerRestart()">Restart Timer</button> |
| <br /> |
| Timer Status: <span class="userStatus" id="timerStatus">Not Set</span> |
| </p> |
| <h2>goog.Timer.callOnce</h2> |
| Timer also has a useful utility function that can call an action after some |
| timeout. |
| <br /> |
| This a shortcut/replacement for window.setTimeout, and has a |
| corresponding goog.Timer.clear as well, which stops the action. |
| <p> |
| Timeout (seconds): <input size="2" type="text" id="doOnceSeconds" value="2"> |
| <button onclick="doOnce()">Go</button> |
| <button onclick="doOnceClear()">Clear</button> |
| <br /> |
| Do Once Status: <span class="userStatus" id="doOnceStatus"></span> |
| </p> |
| <script> |
| |
| /** |
| * Get the seconds from a document element. |
| * @param {string} id The id of the element |
| * @return {number} |
| */ |
| var getSeconds = function (id) { |
| var time = Number(goog.dom.getElement(id).value); |
| if (isNaN(time)) { |
| alert('Please enter a Number'); |
| return null; |
| } else { |
| return time; |
| } |
| }; |
| |
| /** |
| * Convert seconds to ms. |
| * @param {number} seconds The time in Seconds |
| * @return {number} |
| */ |
| var inMs = function (seconds) { |
| return seconds * 1000; |
| }; |
| |
| /** |
| * Delay. |
| */ |
| |
| var delay = null; |
| var delayStatus = goog.dom.getElement('delayStatus'); |
| |
| /** |
| * Start the delay, on the button press. |
| */ |
| var doDelay = function() { |
| if (delay) { |
| goog.dom.setTextContent(delayStatus, 'Delay already set.'); |
| return; |
| } |
| |
| var seconds = getSeconds('delaySeconds'); |
| if (!goog.isNumber(seconds)) { |
| return; |
| } |
| delay = new goog.async.Delay(delayedAction, inMs(seconds)); |
| delay.start(); |
| goog.dom.setTextContent(delayStatus, |
| 'Delay for: ' + seconds + ' seconds.'); |
| }; |
| |
| /** |
| * Reset the delay. |
| */ |
| var doReset = function(){ |
| if (!delay) { |
| return; |
| } |
| goog.dom.setTextContent(delayStatus, 'Delay Restarted.'); |
| delay.start(); |
| }; |
| |
| /** |
| * Callback, after some delay. |
| */ |
| var delayedAction = function() { |
| goog.dom.setTextContent(delayStatus, 'Action called.'); |
| delay.dispose(); |
| delay = null; |
| }; |
| |
| /** |
| * Throttle. |
| */ |
| |
| var throttle = null; |
| var throttleCount = 0; |
| var throttleFireCount = 0; |
| var throttleHits = goog.dom.getElement('throttleHits'); |
| var throttleStatus = goog.dom.getElement('throttleStatus'); |
| |
| /** |
| * Start a Throttle. |
| */ |
| var doThrottleStart = function() { |
| var seconds = getSeconds('throttleSeconds'); |
| if (!goog.isNumber(seconds)) { |
| return; |
| } |
| // Get rid of an old one, if it exists. |
| if (throttle) { |
| throttle.dispose(); |
| throttleCount = 0; |
| throttleFireCount = 0; |
| } |
| // Create the throttle object for the given time. |
| throttle = new goog.async.Throttle(throttleAction, inMs(seconds)); |
| // Reset the hits and the count. |
| goog.dom.setTextContent(throttleHits, throttleFireCount); |
| goog.dom.setTextContent(throttleStatus, throttleCount); |
| }; |
| |
| /** |
| * Do the throttle action, this can be called as often as desired. |
| */ |
| var doThrottle = function(){ |
| if (throttle) { |
| // Fire the throttle, this will only actually 'fire' no more than |
| // once per interval. |
| throttle.fire(); |
| goog.dom.setTextContent(throttleHits, ++throttleFireCount); |
| } |
| }; |
| |
| /** |
| * Throttle Action Callback. |
| */ |
| var throttleAction = function() { |
| goog.dom.setTextContent(throttleStatus, ++throttleCount); |
| }; |
| |
| /** |
| * Timer. |
| */ |
| |
| var timer = null; |
| var timerStatus = goog.dom.getElement('timerStatus'); |
| var tickCount = 0; |
| |
| /** |
| * Start a timer. |
| */ |
| var doTimerStart = function() { |
| var seconds = getSeconds('timerSeconds'); |
| if (!goog.isNumber(seconds)) { |
| return; |
| } |
| if (timer) { |
| timer.dispose(); |
| tickCount = 0; |
| } |
| // A timer can be created with no callback object, |
| // listen for the TICK event. |
| timer = new goog.Timer(inMs(seconds)); |
| timer.start(); |
| goog.events.listen(timer, goog.Timer.TICK, tickAction); |
| }; |
| |
| /** |
| * Stop the Timer. |
| */ |
| var doTimerStop = function() { |
| if (timer) { |
| timer.stop(); |
| } |
| }; |
| |
| /** |
| * Reset the Timer. |
| */ |
| var doTimerRestart = function() { |
| if (timer) { |
| timer.start(); |
| } |
| }; |
| |
| /** |
| * Tick callback, called whenever the Timer sends a TICK event. |
| */ |
| var tickAction = function() { |
| tickCount++; |
| goog.dom.setTextContent(timerStatus, 'Got tick: ' + tickCount); |
| }; |
| |
| var doOnceTimer = null; |
| var doOnceStatus = goog.dom.getElement('doOnceStatus'); |
| |
| /* |
| * Do some action once, optional delay. Can not be restarted, like Delay, |
| * only cleared. |
| */ |
| var doOnce = function() { |
| if (doOnceTimer) { |
| // Timer already set, do not reset it. |
| return; |
| } |
| var seconds = getSeconds('doOnceSeconds'); |
| if (!goog.isNumber(seconds)) { |
| return; |
| } |
| goog.dom.setTextContent(doOnceStatus, 'Will call action in ' + seconds + |
| ' seconds.'); |
| doOnceTimer = goog.Timer.callOnce(function() { |
| goog.dom.setTextContent(doOnceStatus, 'Action called.'); |
| doOnceTimer = null; |
| }, inMs(seconds)); |
| }; |
| |
| /* |
| * Clear the doOnce, do not do the action. |
| */ |
| var doOnceClear = function() { |
| goog.Timer.clear(doOnceTimer); |
| doOnceTimer = null; |
| goog.dom.setTextContent(doOnceStatus, |
| 'Timer cleared, action not called.'); |
| }; |
| |
| </script> |
| </body> |
| </html> |