You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.8 KiB
80 lines
1.8 KiB
/** @license MIT License (c) copyright 2010-2014 original author or authors */ |
|
/** @author Brian Cavalier */ |
|
/** @author John Hann */ |
|
|
|
(function(define) { 'use strict'; |
|
define(function() { |
|
|
|
// Credit to Twisol (https://github.com/Twisol) for suggesting |
|
// this type of extensible queue + trampoline approach for next-tick conflation. |
|
|
|
/** |
|
* Async task scheduler |
|
* @param {function} async function to schedule a single async function |
|
* @constructor |
|
*/ |
|
function Scheduler(async) { |
|
this._async = async; |
|
this._running = false; |
|
|
|
this._queue = new Array(1<<16); |
|
this._queueLen = 0; |
|
this._afterQueue = new Array(1<<4); |
|
this._afterQueueLen = 0; |
|
|
|
var self = this; |
|
this.drain = function() { |
|
self._drain(); |
|
}; |
|
} |
|
|
|
/** |
|
* Enqueue a task |
|
* @param {{ run:function }} task |
|
*/ |
|
Scheduler.prototype.enqueue = function(task) { |
|
this._queue[this._queueLen++] = task; |
|
this.run(); |
|
}; |
|
|
|
/** |
|
* Enqueue a task to run after the main task queue |
|
* @param {{ run:function }} task |
|
*/ |
|
Scheduler.prototype.afterQueue = function(task) { |
|
this._afterQueue[this._afterQueueLen++] = task; |
|
this.run(); |
|
}; |
|
|
|
Scheduler.prototype.run = function() { |
|
if (!this._running) { |
|
this._running = true; |
|
this._async(this.drain); |
|
} |
|
}; |
|
|
|
/** |
|
* Drain the handler queue entirely, and then the after queue |
|
*/ |
|
Scheduler.prototype._drain = function() { |
|
var i = 0; |
|
for (; i < this._queueLen; ++i) { |
|
this._queue[i].run(); |
|
this._queue[i] = void 0; |
|
} |
|
|
|
this._queueLen = 0; |
|
this._running = false; |
|
|
|
for (i = 0; i < this._afterQueueLen; ++i) { |
|
this._afterQueue[i].run(); |
|
this._afterQueue[i] = void 0; |
|
} |
|
|
|
this._afterQueueLen = 0; |
|
}; |
|
|
|
return Scheduler; |
|
|
|
}); |
|
}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
|
|
|