123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * Caleb James DeLisle
- * Sat Mar 23 01:42:29 EDT 2013
- * Public Domain
- */
- ;(function() {
- var nThen = function(next) {
- var funcs = [];
- var timeouts = [];
- var calls = 0;
- var abort;
- var waitFor = function(func) {
- calls++;
- return function() {
- if (func) {
- func.apply(null, arguments);
- }
- calls = (calls || 1) - 1;
- while (!calls && funcs.length && !abort) {
- funcs.shift()(waitFor);
- }
- };
- };
- waitFor.abort = function () {
- timeouts.forEach(clearTimeout);
- abort = 1;
- };
- var ret = {
- nThen: function(next) {
- if (!abort) {
- if (!calls) {
- next(waitFor);
- } else {
- funcs.push(next);
- }
- }
- return ret;
- },
- orTimeout: function(func, milliseconds) {
- if (abort) { return ret; }
- if (!milliseconds) { throw Error("Must specify milliseconds to orTimeout()"); }
- var cto;
- var timeout = setTimeout(function() {
- while (funcs.shift() !== cto) ;
- func(waitFor);
- calls = (calls || 1) - 1;
- while (!calls && funcs.length) { funcs.shift()(waitFor); }
- }, milliseconds);
- funcs.push(cto = function() {
- for (var i = 0; i < timeouts.length; i++) {
- if (timeouts[i] === timeout) {
- timeouts.splice(i, 1);
- clearTimeout(timeout);
- return;
- }
- }
- throw new Error('timeout not listed in array');
- });
- timeouts.push(timeout);
- return ret;
- }
- };
- return ret.nThen(next);
- };
- if (typeof(define) == 'function') {
- // AMD (require.js etc)
- define([], function() { return nThen; });
- } else if (typeof(window) !== 'undefined') {
- // Browser global var nThen
- window.nThen = nThen;
- }
- if (typeof(module) !== 'undefined' && module.exports) {
- // Node.js
- module.exports = nThen;
- }
- })();
|