Created
April 13, 2012 06:05
-
-
Save tsmallfield/2374247 to your computer and use it in GitHub Desktop.
deferred
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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 | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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 | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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 | |
}; | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
////////////////////////////////////////////////// | |
/** | |
* @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()) | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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