async-queue.js.html revision ec1700de1682e716345e98bad588e6d0c707d1a0
<head>
</head>
<body id="yahoo-com">
<div id="doc3" class="yui-t2">
<div id="hd">
<h3>queue-run <span class="subtitle">3.0.0</span></h3>
> queue-run.js (source view)
<form onsubmit="return false">
<div id="propertysearch">
Search: <input autocomplete="off" id="searchinput" />
<div id="searchresults">
</div>
</div>
</form>
</div>
<div id="bd">
<div id="yui-main">
<div class="yui-b">
<form action="#" name="yui-classopts-form" method="get" id="yui-classopts-form">
<fieldset>
<legend>Filters</legend>
<span class="classopts"><input type="checkbox" name="show_private" id="show_private" /> <label for="show_private">Show Private</label></span>
<span class="classopts"><input type="checkbox" name="show_protected" id="show_protected" /> <label for="show_protected">Show Protected</label></span>
<span class="classopts"><input type="checkbox" name="show_deprecated" id="show_deprecated" /> <label for="show_deprecated">Show Deprecated</label></span>
</fieldset>
</form>
<div id="srcout">
<style>
#doc3 .classopts { display:none; }
</style>
<div class="highlight" ><pre><span class="c">/**</span>
<span class="c"> * <p>AsyncQueue allows you create a chain of function callbacks executed</span>
<span class="c"> * via setTimeout (or synchronously) that are guaranteed to run in order.</span>
<span class="c"> * Items in the queue can be promoted or removed. Start or resume the</span>
<span class="c"> * execution chain with run(). pause() to temporarily delay execution, or</span>
<span class="c"> * stop() to halt and clear the queue.</p></span>
<span class="c"> *</span>
<span class="c"> * @module queue-run</span>
<span class="c"> */</span>
<span class="c">/**</span>
<span class="c"> * <p>A specialized queue class that supports scheduling callbacks to execute</span>
<span class="c"> * sequentially, iteratively, even asynchronously.</p></span>
<span class="c"> *</span>
<span class="c"> * <p>Callbacks can be function refs or objects with the following keys. Only</span>
<span class="c"> * the <code>fn</code> key is required.</p></span>
<span class="c"> *</span>
<span class="c"> * <ul></span>
<span class="c"> * <li><code>fn</code> -- The callback function</li></span>
<span class="c"> * <li><code>context</code> -- The execution context for the callbackFn.</li></span>
<span class="c"> * <li><code>args</code> -- Arguments to pass to callbackFn.</li></span>
<span class="c"> * <li><code>timeout</code> -- Millisecond delay before executing callbackFn.</span>
<span class="c"> * (Applies to each iterative execution of callback)</li></span>
<span class="c"> * <li><code>iterations</code> -- Number of times to repeat the callback.</span>
<span class="c"> * <li><code>until</code> -- Repeat the callback until this function returns</span>
<span class="c"> * true. This setting trumps iterations.</li></span>
<span class="c"> * <li><code>autoContinue</code> -- Set to false to prevent the AsyncQueue from</span>
<span class="c"> * executing the next callback in the Queue after</span>
<span class="c"> * the callback completes.</li></span>
<span class="c"> * <li><code>id</code> -- Name that can be used to get, promote, get the</span>
<span class="c"> * indexOf, or delete this callback.</li></span>
<span class="c"> * </ul></span>
<span class="c"> *</span>
<span class="c"> * @class AsyncQueue</span>
<span class="c"> * @extends EventTarget</span>
<span class="c"> * @constructor</span>
<span class="c"> */</span>
<span class="nx">Y</span><span class="o">.</span><span class="nx">AsyncQueue</span> <span class="o">=</span> <span class="k">function</span><span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_init</span><span class="o">();</span>
<span class="k">this</span><span class="o">.</span><span class="nx">add</span><span class="o">.</span><span class="nx">apply</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="nx">arguments</span><span class="o">);</span>
<span class="o">};</span>
<span class="k">var</span> <span class="nx">Queue</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">AsyncQueue</span><span class="o">,</span>
<span class="nx">EXECUTE</span> <span class="o">=</span> <span class="s1">'execute'</span><span class="o">,</span>
<span class="nx">SHIFT</span> <span class="o">=</span> <span class="s1">'shift'</span><span class="o">,</span>
<span class="nx">PROMOTE</span> <span class="o">=</span> <span class="s1">'promote'</span><span class="o">,</span>
<span class="nx">REMOVE</span> <span class="o">=</span> <span class="s1">'remove'</span><span class="o">,</span>
<span class="nx">isObject</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">Lang</span><span class="o">.</span><span class="nx">isObject</span><span class="o">,</span>
<span class="nx">isFunction</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">Lang</span><span class="o">.</span><span class="nx">isFunction</span><span class="o">;</span>
<span class="c">/**</span>
<span class="c"> * <p>Static default values used to populate callback configuration properties.</span>
<span class="c"> * Preconfigured defaults include:</p></span>
<span class="c"> *</span>
<span class="c"> * <ul></span>
<span class="c"> * <li><code>autoContinue</code>: <code>true</code></li></span>
<span class="c"> * <li><code>iterations</code>: 1</li></span>
<span class="c"> * <li><code>timeout</code>: 10 (10ms between callbacks)</li></span>
<span class="c"> * <li><code>until</code>: (function to run until iterations &lt;= 0)</li></span>
<span class="c"> * </ul></span>
<span class="c"> *</span>
<span class="c"> * @type {Object}</span>
<span class="c"> * @static</span>
<span class="c"> */</span>
<span class="nx">Queue</span><span class="o">.</span><span class="nx">defaults</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">mix</span><span class="o">({</span>
<span class="nx">autoContinue</span> <span class="o">:</span> <span class="kc">true</span><span class="o">,</span>
<span class="nx">iterations</span> <span class="o">:</span> <span class="m">1</span><span class="o">,</span>
<span class="nx">timeout</span> <span class="o">:</span> <span class="m">10</span><span class="o">,</span>
<span class="nx">until</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">iterations</span> <span class="o">|=</span> <span class="m">0</span><span class="o">;</span>
<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="nx">iterations</span> <span class="o"><=</span> <span class="m">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">},</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">config</span><span class="o">.</span><span class="nx">queueDefaults</span> <span class="o">||</span> <span class="o">{});</span>
<span class="nx">Y</span><span class="o">.</span><span class="nx">extend</span><span class="o">(</span><span class="nx">Queue</span><span class="o">,</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">EventTarget</span><span class="o">,</span> <span class="o">{</span>
<span class="c">/**</span>
<span class="c"> * Used to indicate the queue is currently executing a callback.</span>
<span class="c"> *</span>
<span class="c"> * @property _running</span>
<span class="c"> * @type {Boolean|Object} true for synchronous callback execution, the</span>
<span class="c"> * Otherwise false.</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_running</span> <span class="o">:</span> <span class="kc">false</span><span class="o">,</span>
<span class="c">/**</span>
<span class="c"> * Initializes the AsyncQueue instance properties and events.</span>
<span class="c"> *</span>
<span class="c"> * @method _init</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_init</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="nx">Y</span><span class="o">.</span><span class="nx">EventTarget</span><span class="o">.</span><span class="nx">call</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="o">{</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_q</span> <span class="o">=</span> <span class="o">[];</span>
<span class="c">/** </span>
<span class="c"> * Callback defaults for this instance. Static defaults that are not</span>
<span class="c"> * overridden are also included.</span>
<span class="c"> *</span>
<span class="c"> * @property defaults</span>
<span class="c"> * @type {Object}</span>
<span class="c"> */</span>
<span class="k">this</span><span class="o">.</span><span class="nx">defaults</span> <span class="o">=</span> <span class="o">{};</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_initEvents</span><span class="o">();</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Initializes the instance events.</span>
<span class="c"> *</span>
<span class="c"> * @method _initEvents</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_initEvents</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="c">/*</span>
<span class="c"> 'execute' : { defaultFn : this._defExecFn },</span>
<span class="c"> 'shift' : { defaultFn : this._defShiftFn },</span>
<span class="c"> 'add' : { defaultFn : this._defAddFn },</span>
<span class="c"> 'promote' : { defaultFn : this._defPromoteFn },</span>
<span class="c"> 'remove' : { defaultFn : this._defRemoveFn }</span>
<span class="c"> });</span>
<span class="c"> */</span>
<span class="k">this</span><span class="o">.</span><span class="nx">publish</span><span class="o">(</span><span class="s1">'execute'</span> <span class="o">,</span> <span class="o">{</span> <span class="nx">defaultFn</span> <span class="o">:</span> <span class="k">this</span><span class="o">.</span><span class="nx">_defExecFn</span><span class="o">,</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="k">this</span><span class="o">.</span><span class="nx">publish</span><span class="o">(</span><span class="s1">'shift'</span> <span class="o">,</span> <span class="o">{</span> <span class="nx">defaultFn</span> <span class="o">:</span> <span class="k">this</span><span class="o">.</span><span class="nx">_defShiftFn</span><span class="o">,</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="k">this</span><span class="o">.</span><span class="nx">publish</span><span class="o">(</span><span class="s1">'add'</span> <span class="o">,</span> <span class="o">{</span> <span class="nx">defaultFn</span> <span class="o">:</span> <span class="k">this</span><span class="o">.</span><span class="nx">_defAddFn</span><span class="o">,</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="k">this</span><span class="o">.</span><span class="nx">publish</span><span class="o">(</span><span class="s1">'promote'</span> <span class="o">,</span> <span class="o">{</span> <span class="nx">defaultFn</span> <span class="o">:</span> <span class="k">this</span><span class="o">.</span><span class="nx">_defPromoteFn</span><span class="o">,</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="k">this</span><span class="o">.</span><span class="nx">publish</span><span class="o">(</span><span class="s1">'remove'</span> <span class="o">,</span> <span class="o">{</span> <span class="nx">defaultFn</span> <span class="o">:</span> <span class="k">this</span><span class="o">.</span><span class="nx">_defRemoveFn</span><span class="o">,</span> <span class="nx">emitFacade</span><span class="o">:</span> <span class="kc">true</span> <span class="o">});</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Returns the next callback needing execution. If a callback is</span>
<span class="c"> * configured to repeat via iterations or until, it will be returned until</span>
<span class="c"> * the completion criteria is met.</span>
<span class="c"> *</span>
<span class="c"> * When the queue is empty, null is returned.</span>
<span class="c"> *</span>
<span class="c"> * @method next</span>
<span class="c"> * @return {Function} the callback to execute</span>
<span class="c"> */</span>
<span class="nx">next</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">callback</span><span class="o">;</span>
<span class="k">while</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">length</span><span class="o">)</span> <span class="o">{</span>
<span class="nx">callback</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">[</span><span class="m">0</span><span class="o">]</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_prepare</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">[</span><span class="m">0</span><span class="o">]);</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">callback</span> <span class="o">&&</span> <span class="nx">callback</span><span class="o">.</span><span class="nx">until</span><span class="o">())</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">SHIFT</span><span class="o">,</span> <span class="o">{</span> <span class="nx">callback</span><span class="o">:</span> <span class="nx">callback</span> <span class="o">});</span>
<span class="nx">callback</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="k">break</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="nx">callback</span> <span class="o">||</span> <span class="kc">null</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Default functionality for the &quot;shift&quot; event. Shifts the</span>
<span class="c"> * callback stored in the event object's <em>callback</em> property from</span>
<span class="c"> * the queue if it is the first item.</span>
<span class="c"> *</span>
<span class="c"> * @method _defShiftFn</span>
<span class="c"> * @param e {Event} The event object</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_defShiftFn</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">e</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">indexOf</span><span class="o">(</span><span class="nx">e</span><span class="o">.</span><span class="nx">callback</span><span class="o">)</span> <span class="o">===</span> <span class="m">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">shift</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Creates a wrapper function to execute the callback using the aggregated </span>
<span class="c"> * instance defaults, and the specified callback settings.</span>
<span class="c"> *</span>
<span class="c"> * The wrapper function is decorated with the callback configuration as</span>
<span class="c"> * properties for runtime modification.</span>
<span class="c"> *</span>
<span class="c"> * @method _prepare</span>
<span class="c"> * @param callback {Object|Function} the raw callback</span>
<span class="c"> * @return {Function} a decorated function wrapper to execute the callback</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_prepare</span><span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">isFunction</span><span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">&&</span> <span class="nx">callback</span><span class="o">.</span><span class="nx">_prepared</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="nx">callback</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">merge</span><span class="o">(</span>
<span class="nx">Queue</span><span class="o">.</span><span class="nx">defaults</span><span class="o">,</span>
<span class="o">{</span> <span class="nx">context</span> <span class="o">:</span> <span class="k">this</span><span class="o">,</span> <span class="nx">args</span><span class="o">:</span> <span class="o">[],</span> <span class="nx">_prepared</span><span class="o">:</span> <span class="kc">true</span> <span class="o">},</span>
<span class="k">this</span><span class="o">.</span><span class="nx">defaults</span><span class="o">,</span>
<span class="o">(</span><span class="nx">isFunction</span><span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">?</span> <span class="o">{</span> <span class="nx">fn</span><span class="o">:</span> <span class="nx">callback</span> <span class="o">}</span> <span class="o">:</span> <span class="nx">callback</span><span class="o">)),</span>
<span class="nx">wrapper</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">bind</span><span class="o">(</span><span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(!</span><span class="nx">wrapper</span><span class="o">.</span><span class="nx">_running</span><span class="o">)</span> <span class="o">{</span>
<span class="nx">wrapper</span><span class="o">.</span><span class="nx">iterations</span><span class="o">--;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">isFunction</span><span class="o">(</span><span class="nx">wrapper</span><span class="o">.</span><span class="nx">fn</span><span class="o">))</span> <span class="o">{</span>
<span class="nx">wrapper</span><span class="o">.</span><span class="nx">fn</span><span class="o">.</span><span class="nx">apply</span><span class="o">(</span><span class="nx">wrapper</span><span class="o">.</span><span class="nx">context</span> <span class="o">||</span> <span class="nx">Y</span><span class="o">,</span>
<span class="nx">Y</span><span class="o">.</span><span class="nb">Array</span><span class="o">(</span><span class="nx">wrapper</span><span class="o">.</span><span class="nx">args</span><span class="o">));</span>
<span class="o">}</span>
<span class="o">},</span> <span class="k">this</span><span class="o">);</span>
<span class="k">return</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">mix</span><span class="o">(</span><span class="nx">wrapper</span><span class="o">,</span> <span class="nx">config</span><span class="o">);</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Sets the queue in motion. All queued callbacks will be executed in</span>
<span class="c"> * order unless pause() or stop() is called or if one of the callbacks is</span>
<span class="c"> * configured with autoContinue: false.</span>
<span class="c"> *</span>
<span class="c"> * @method run</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">run</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">callback</span><span class="o">,</span>
<span class="nx">cont</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="nx">callback</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">next</span><span class="o">();</span>
<span class="nx">cont</span> <span class="o">&&</span> <span class="nx">callback</span> <span class="o">&&</span> <span class="o">!</span><span class="k">this</span><span class="o">.</span><span class="nx">isRunning</span><span class="o">();</span>
<span class="nx">callback</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">next</span><span class="o">())</span>
<span class="o">{</span>
<span class="nx">cont</span> <span class="o">=</span> <span class="o">(</span><span class="nx">callback</span><span class="o">.</span><span class="nx">timeout</span> <span class="o"><</span> <span class="m">0</span><span class="o">)</span> <span class="o">?</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_execute</span><span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">:</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_schedule</span><span class="o">(</span><span class="nx">callback</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(!</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="c">/**</span>
<span class="c"> * Event fired after the last queued callback is executed.</span>
<span class="c"> * @event complete</span>
<span class="c"> */</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="s1">'complete'</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="k">this</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Handles the execution of callbacks. Returns a boolean indicating</span>
<span class="c"> * whether it is appropriate to continue running.</span>
<span class="c"> *</span>
<span class="c"> * @method _execute</span>
<span class="c"> * @param callback {Object} the callback object to execute</span>
<span class="c"> * @return {Boolean} whether the run loop should continue</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_execute</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="nx">callback</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="nx">callback</span><span class="o">.</span><span class="nx">iterations</span><span class="o">--;</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">EXECUTE</span><span class="o">,</span> <span class="o">{</span> <span class="nx">callback</span><span class="o">:</span> <span class="nx">callback</span> <span class="o">});</span>
<span class="k">var</span> <span class="nx">cont</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_running</span> <span class="o">&&</span> <span class="nx">callback</span><span class="o">.</span><span class="nx">autoContinue</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="nx">callback</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="k">return</span> <span class="nx">cont</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Schedules the execution of asynchronous callbacks.</span>
<span class="c"> *</span>
<span class="c"> * @method _schedule</span>
<span class="c"> * @param callback {Object} the callback object to execute</span>
<span class="c"> * @return {Boolean} whether the run loop should continue</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_schedule</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="nx">Y</span><span class="o">.</span><span class="nx">later</span><span class="o">(</span><span class="nx">callback</span><span class="o">.</span><span class="nx">timeout</span><span class="o">,</span> <span class="k">this</span><span class="o">,</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">_execute</span><span class="o">(</span><span class="nx">callback</span><span class="o">))</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">run</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Determines if the queue is waiting for a callback to complete execution.</span>
<span class="c"> *</span>
<span class="c"> * @method isRunning</span>
<span class="c"> * @return {Boolean} true if queue is waiting for a </span>
<span class="c"> * from any initiated transactions</span>
<span class="c"> */</span>
<span class="nx">isRunning</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="o">!!</span><span class="k">this</span><span class="o">.</span><span class="nx">_running</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Default functionality for the &quot;execute&quot; event. Executes the</span>
<span class="c"> * callback function</span>
<span class="c"> *</span>
<span class="c"> * @method _defExecFn</span>
<span class="c"> * @param e {Event} the event object</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_defExecFn</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">e</span><span class="o">)</span> <span class="o">{</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">callback</span><span class="o">();</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Add any number of callbacks to the end of the queue. Callbacks may be</span>
<span class="c"> * provided as functions or objects.</span>
<span class="c"> *</span>
<span class="c"> * @method add</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">add</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="s1">'add'</span><span class="o">,</span> <span class="o">{</span> <span class="nx">callbacks</span><span class="o">:</span> <span class="nx">Y</span><span class="o">.</span><span class="nb">Array</span><span class="o">(</span><span class="nx">arguments</span><span class="o">,</span><span class="m">0</span><span class="o">,</span><span class="kc">true</span><span class="o">)</span> <span class="o">});</span>
<span class="k">return</span> <span class="k">this</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Default functionality for the &quot;add&quot; event. Adds the callbacks</span>
<span class="c"> * in the event facade to the queue. Callbacks successfully added to the</span>
<span class="c"> * queue are present in the event's <code>added</code> property in the</span>
<span class="c"> * after phase.</span>
<span class="c"> *</span>
<span class="c"> * @method _defAddFn</span>
<span class="c"> * @param e {Event} the event object</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_defAddFn</span> <span class="o">:</span> <span class="k">function</span><span class="o">(</span><span class="nx">e</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">_q</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">,</span>
<span class="nx">added</span> <span class="o">=</span> <span class="o">[];</span>
<span class="nx">Y</span><span class="o">.</span><span class="nb">Array</span><span class="o">.</span><span class="nx">each</span><span class="o">(</span><span class="nx">e</span><span class="o">.</span><span class="nx">callbacks</span><span class="o">,</span> <span class="k">function</span> <span class="o">(</span><span class="nx">c</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">isObject</span><span class="o">(</span><span class="nx">c</span><span class="o">))</span> <span class="o">{</span>
<span class="nx">_q</span><span class="o">.</span><span class="nx">push</span><span class="o">(</span><span class="nx">c</span><span class="o">);</span>
<span class="nx">added</span><span class="o">.</span><span class="nx">push</span><span class="o">(</span><span class="nx">c</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">added</span> <span class="o">=</span> <span class="nx">added</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Pause the execution of the queue after the execution of the current</span>
<span class="c"> * callback completes. If called from code outside of a queued callback,</span>
<span class="c"> * clears the timeout for the pending callback. Paused queue can be</span>
<span class="c"> *</span>
<span class="c"> * @method pause</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">pause</span><span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">isObject</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">_running</span><span class="o">))</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_running</span><span class="o">.</span><span class="nx">cancel</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_running</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="k">return</span> <span class="k">this</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Stop and clear the queue after the current execution of the</span>
<span class="c"> * current callback completes.</span>
<span class="c"> *</span>
<span class="c"> * @method stop</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">stop</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_q</span> <span class="o">=</span> <span class="o">[];</span>
<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="nx">pause</span><span class="o">();</span>
<span class="o">},</span>
<span class="c">/** </span>
<span class="c"> * Returns the current index of a callback. Pass in either the id or</span>
<span class="c"> * callback function from getCallback.</span>
<span class="c"> *</span>
<span class="c"> * @method indexOf</span>
<span class="c"> * @param callback {String|Function} the callback or its specified id</span>
<span class="c"> * @return {Number} index of the callback or -1 if not found</span>
<span class="c"> */</span>
<span class="nx">indexOf</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="m">0</span><span class="o">,</span> <span class="nx">len</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">length</span><span class="o">,</span> <span class="nx">c</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">len</span><span class="o">;</span> <span class="o">++</span><span class="nx">i</span><span class="o">)</span> <span class="o">{</span>
<span class="nx">c</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">[</span><span class="nx">i</span><span class="o">];</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">c</span> <span class="o">===</span> <span class="nx">callback</span> <span class="o">||</span> <span class="nx">c</span><span class="o">.</span><span class="nx">id</span> <span class="o">===</span> <span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="nx">i</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="o">-</span><span class="m">1</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Retrieve a callback by its id. Useful to modify the configuration</span>
<span class="c"> * while the queue is running.</span>
<span class="c"> *</span>
<span class="c"> * @method getCallback</span>
<span class="c"> * @param id {String} the id assigned to the callback</span>
<span class="c"> * @return {Object} the callback object</span>
<span class="c"> */</span>
<span class="nx">getCallback</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">id</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">indexOf</span><span class="o">(</span><span class="nx">id</span><span class="o">);</span>
<span class="k">return</span> <span class="o">(</span><span class="nx">i</span> <span class="o">></span> <span class="o">-</span><span class="m">1</span><span class="o">)</span> <span class="o">?</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">[</span><span class="nx">i</span><span class="o">]</span> <span class="o">:</span> <span class="kc">null</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Promotes the named callback to the top of the queue. If a callback is</span>
<span class="c"> * currently executing or looping (via until or iterations), the promotion</span>
<span class="c"> * is scheduled to occur after the current callback has completed.</span>
<span class="c"> *</span>
<span class="c"> * @method promote</span>
<span class="c"> * @param callback {String|Object} the callback object or a callback's id</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">promote</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">payload</span> <span class="o">=</span> <span class="o">{</span> <span class="nx">callback</span> <span class="o">:</span> <span class="nx">callback</span> <span class="o">},</span><span class="nx">e</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">isRunning</span><span class="o">())</span> <span class="o">{</span>
<span class="nx">e</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">after</span><span class="o">(</span><span class="nx">SHIFT</span><span class="o">,</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">PROMOTE</span><span class="o">,</span> <span class="nx">payload</span><span class="o">);</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">detach</span><span class="o">();</span>
<span class="o">},</span> <span class="k">this</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">PROMOTE</span><span class="o">,</span> <span class="nx">payload</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="k">this</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * <p>Default functionality for the &quot;promote&quot; event. Promotes the</span>
<span class="c"> * named callback to the head of the queue.</p></span>
<span class="c"> *</span>
<span class="c"> * <p>The event object will contain a property &quot;callback&quot;, which</span>
<span class="c"> * holds the id of a callback or the callback object itself.</p></span>
<span class="c"> *</span>
<span class="c"> * @method _defPromoteFn</span>
<span class="c"> * @param e {Event} the custom event</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_defPromoteFn</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">e</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">indexOf</span><span class="o">(</span><span class="nx">e</span><span class="o">.</span><span class="nx">callback</span><span class="o">),</span>
<span class="nx">promoted</span> <span class="o">=</span> <span class="o">(</span><span class="nx">i</span> <span class="o">></span> <span class="o">-</span><span class="m">1</span><span class="o">)</span> <span class="o">?</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">splice</span><span class="o">(</span><span class="nx">i</span><span class="o">,</span><span class="m">1</span><span class="o">)[</span><span class="m">0</span><span class="o">]</span> <span class="o">:</span> <span class="kc">null</span><span class="o">;</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">promoted</span> <span class="o">=</span> <span class="nx">promoted</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="nx">promoted</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">unshift</span><span class="o">(</span><span class="nx">promoted</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Removes the callback from the queue. If the queue is active, the</span>
<span class="c"> * removal is scheduled to occur after the current callback has completed.</span>
<span class="c"> *</span>
<span class="c"> * @method remove</span>
<span class="c"> * @param callback {String|Object} the callback object or a callback's id</span>
<span class="c"> * @return {AsyncQueue} the AsyncQueue instance</span>
<span class="c"> * @chainable</span>
<span class="c"> */</span>
<span class="nx">remove</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">callback</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">payload</span> <span class="o">=</span> <span class="o">{</span> <span class="nx">callback</span> <span class="o">:</span> <span class="nx">callback</span> <span class="o">},</span><span class="nx">e</span><span class="o">;</span>
<span class="c">// Can't return the removed callback because of the deferral until</span>
<span class="c"></span> <span class="c">// current callback is complete</span>
<span class="c"></span> <span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="nx">isRunning</span><span class="o">())</span> <span class="o">{</span>
<span class="nx">e</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">after</span><span class="o">(</span><span class="nx">SHIFT</span><span class="o">,</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">REMOVE</span><span class="o">,</span> <span class="nx">payload</span><span class="o">);</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">detach</span><span class="o">();</span>
<span class="o">},</span><span class="k">this</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">fire</span><span class="o">(</span><span class="nx">REMOVE</span><span class="o">,</span> <span class="nx">payload</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="k">this</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * <p>Default functionality for the &quot;remove&quot; event. Removes the</span>
<span class="c"> * callback from the queue.</p></span>
<span class="c"> *</span>
<span class="c"> * <p>The event object will contain a property &quot;callback&quot;, which</span>
<span class="c"> * holds the id of a callback or the callback object itself.</p></span>
<span class="c"> *</span>
<span class="c"> * @method _defRemoveFn</span>
<span class="c"> * @param e {Event} the custom event</span>
<span class="c"> * @protected</span>
<span class="c"> */</span>
<span class="nx">_defRemoveFn</span> <span class="o">:</span> <span class="k">function</span> <span class="o">(</span><span class="nx">e</span><span class="o">)</span> <span class="o">{</span>
<span class="k">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="nx">indexOf</span><span class="o">(</span><span class="nx">e</span><span class="o">.</span><span class="nx">callback</span><span class="o">);</span>
<span class="nx">e</span><span class="o">.</span><span class="nx">removed</span> <span class="o">=</span> <span class="o">(</span><span class="nx">i</span> <span class="o">></span> <span class="o">-</span><span class="m">1</span><span class="o">)</span> <span class="o">?</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">splice</span><span class="o">(</span><span class="nx">i</span><span class="o">,</span><span class="m">1</span><span class="o">)[</span><span class="m">0</span><span class="o">]</span> <span class="o">:</span> <span class="kc">null</span><span class="o">;</span>
<span class="o">},</span>
<span class="c">/**</span>
<span class="c"> * Returns the number of callbacks in the queue.</span>
<span class="c"> *</span>
<span class="c"> * @method size</span>
<span class="c"> * @return {Number}</span>
<span class="c"> */</span>
<span class="nx">size</span> <span class="o">:</span> <span class="k">function</span> <span class="o">()</span> <span class="o">{</span>
<span class="c">// next() flushes callbacks that have met their until() criteria and</span>
<span class="c"></span> <span class="c">// therefore shouldn't count since they wouldn't execute anyway.</span>
<span class="c"></span> <span class="k">if</span> <span class="o">(!</span><span class="k">this</span><span class="o">.</span><span class="nx">isRunning</span><span class="o">())</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="nx">next</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="nx">_q</span><span class="o">.</span><span class="nx">length</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">});</span>
</pre></div>
</div>
</div>
</div>
<div class="yui-b">
<div class="nav">
<div id="moduleList" class="module">
<h4>Modules</h4>
<ul class="content">
<li class=""><a href="module_classnamemanager.html" title="classnamemanager">classnamemanager</a></li>
<li class=""><a href="module_node-focusmanager.html" title="node-focusmanager">node-focusmanager</a></li>
<li class=""><a href="module_widget-position-ext.html" title="widget-position-ext">widget-position-ext</a></li>
</ul>
</div>
<div id="classList" class="module">
<h4>Classes</h4>
<ul class="content">
</ul>
</div>
<div id="fileList" class="module">
<h4>Files</h4>
<ul class="content">
</ul>
</div>
</div>
</div>
</div>
<div id="ft">
<hr />
Copyright © 2009 Yahoo! Inc. All rights reserved.
</div>
</div>
<script type="text/javascript">
ALL_YUI_PROPS = [{"access": "", "host": "AsyncQueue", "name": "add", "url": "AsyncQueue.html#method_add", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "AsyncQueue.defaults", "url": "AsyncQueue.html#property_AsyncQueue.defaults", "type": "property"}, {"access": "", "host": "AsyncQueue", "name": "complete", "url": "AsyncQueue.html#event_complete", "type": "event"}, {"access": "protected", "host": "AsyncQueue", "name": "_defAddFn", "url": "AsyncQueue.html#method__defAddFn", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "defaults", "url": "AsyncQueue.html#property_defaults", "type": "property"}, {"access": "protected", "host": "AsyncQueue", "name": "_defExecFn", "url": "AsyncQueue.html#method__defExecFn", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_defPromoteFn", "url": "AsyncQueue.html#method__defPromoteFn", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_defRemoveFn", "url": "AsyncQueue.html#method__defRemoveFn", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_defShiftFn", "url": "AsyncQueue.html#method__defShiftFn", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_execute", "url": "AsyncQueue.html#method__execute", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "getCallback", "url": "AsyncQueue.html#method_getCallback", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "indexOf", "url": "AsyncQueue.html#method_indexOf", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_init", "url": "AsyncQueue.html#method__init", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_initEvents", "url": "AsyncQueue.html#method__initEvents", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "isRunning", "url": "AsyncQueue.html#method_isRunning", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "next", "url": "AsyncQueue.html#method_next", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "pause", "url": "AsyncQueue.html#method_pause", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_prepare", "url": "AsyncQueue.html#method__prepare", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "promote", "url": "AsyncQueue.html#method_promote", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "remove", "url": "AsyncQueue.html#method_remove", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "run", "url": "AsyncQueue.html#method_run", "type": "method"}, {"access": "protected", "host": "AsyncQueue", "name": "_running", "url": "AsyncQueue.html#property__running", "type": "property"}, {"access": "protected", "host": "AsyncQueue", "name": "_schedule", "url": "AsyncQueue.html#method__schedule", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "size", "url": "AsyncQueue.html#method_size", "type": "method"}, {"access": "", "host": "AsyncQueue", "name": "stop", "url": "AsyncQueue.html#method_stop", "type": "method"}];
</script>
</body>
</html>