Skip to content

Instantly share code, notes, and snippets.

@tsmallfield
Created April 13, 2012 06:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsmallfield/2374247 to your computer and use it in GitHub Desktop.
Save tsmallfield/2374247 to your computer and use it in GitHub Desktop.
deferred
/**
* @return {Object.<function>}
*/
function Deferred() {
/*-------------------------------------------
INIT
-------------------------------------------*/
var queue = [];
/*-------------------------------------------
PUBLIC
-------------------------------------------*/
function resolve() {
var arr = [].concat(queue),
len = arr.length,
i = 0;
queue = null;
for (; i < len; ++i) {
arr[i]();
}
}
function done(fnc) {
queue ? queue.push(fnc) : fnc();
}
function promise() {
return {
done : done
};
}
/*-------------------------------------------
EXPORT
-------------------------------------------*/
return {
resolve : resolve,
promise : promise,
done : done
};
}
/**
* @return {Object.<function>}
*/
function Deferred() {
/*-------------------------------------------
PRIVATE
-------------------------------------------*/
var _queue = [],
_data;
/*-------------------------------------------
PUBLIC
-------------------------------------------*/
/**
* @return {boolean}
*/
function isResolved() {
return !_queue;
}
/**
* @param {*} data
* @return {undefined}
*/
function resolve(data) {
if (isResolved()) {
return;
}
var arr = _queue,
len = arr.length,
i = 0;
_queue = null;
_data = data;
for (; i < len; ++i) {
arr[i](data);
}
}
/**
* @param {function} func
* @return {undefined}
*/
function done(func) {
_queue ? _queue.push(func) : func(_data);
}
/*-------------------------------------------
EXPORT
-------------------------------------------*/
return {
isResolved : isResolved,
resolve : resolve,
done : done
};
}
/**
* @return {Object.<function>}
*/
function DeferredQueue() {
/*-------------------------------------------
INIT
-------------------------------------------*/
var queue = [],
isReady = 1;
/*-------------------------------------------
PRIVATE
-------------------------------------------*/
function exec() {
var arr = queue,
len = arr.length,
fnc;
isReady = !len;
if (len) {
fnc = queue.shift();
fnc().done(exec);
}
}
/*-------------------------------------------
PUBLIC
-------------------------------------------*/
function done(fnc) {
var arr = queue;
arr.push(fnc);
if (isReady) {
exec();
}
}
/*-------------------------------------------
EXPORT
-------------------------------------------*/
return {
done : done
};
}
//////////////////////////////////////////////////
/**
* @param {function:Deferred} fnc
* @return {Object.<function>}
*/
function pipe(fnc) {
/**
* @param {Deferred} dfd
* @return {function}
*/
function createPipe(dfd1) {
/**
* @param {function:Deferred} fnc
* @return {Object.<function>}
*/
return function(fnc) {
var dfd3 = new Deferred;
dfd1 && dfd1.done && dfd1.done(function(data) {
var dfd2 = fnc(data);
dfd2 && dfd2.done && dfd2.done(function(data) {
dfd3.resolve(data);
});
});
return {
pipe : createPipe(dfd3)
};
};
}
return {
pipe : createPipe(fnc())
};
}
/**
* @param {Array.<Deferred>} arr
* @return {Deferred}
*/
function when(arr) {
var dfd = new Deferred,
len = arr.length,
i = len;
while (i--) {
arr[i].done(handleDone);
}
function handleDone() {
--len || dfd.resolve();
}
return dfd;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment