Skip to content

Instantly share code, notes, and snippets.

@topliceanu
Created July 9, 2011 12:53
Show Gist options
  • Save topliceanu/1073564 to your computer and use it in GitHub Desktop.
Save topliceanu/1073564 to your computer and use it in GitHub Desktop.
simple deferred object implementation, library & platform agnostic
var newDefered = function(){
var state = 0 ; // 0 - unresolved, 1 - resolved, 2 - rejected
var resolveCallbacks = [] ;
var resolveArgs = [] ;
var rejectCallbacks = [] ;
var rejectArgs = [] ;
var execute = function( callbacks, args ){
while( callbacks.length !== 0 ){
callbacks.shift().call( {}, args ) ;
}
} ;
var done = function( callback ){
resolveCallbacks.push( callback );
if( state === 1 ){
execute( resolveCallbacks , resolveArgs );
}
return that ;
} ;
var fail = function( callback ){
rejectCallbacks.push( callback );
if( state === 2 ){
execute( rejectCallbacks, rejectCallbacks );
}
return that ;
} ;
var resolve = function(){
if( state !== 0 ) {
throw Error( 'State already resolved' );
}
state = 1 ;
resolveArgs = Array.prototype.slice.call( arguments );
execute( resolveCallbacks , resolveArgs ) ;
return that ;
} ;
var reject = function(){
if( state !== 0 ){
throw Error( 'State already resolved' );
}
state = 2 ;
rejectArgs = Array.prototype.slice.call( arguments );
execute( resolveCallbacks , rejectArgs ) ;
return that ;
} ;
var isRejected = function(){
return state === 2 ;
} ;
var isResolved = function(){
return state === 1 ;
} ;
var getPromise = function(){
return promise ;
};
// public module api
var promise = {
isRejected : isRejected ,
isResolved : isResolved ,
done : done ,
fail : fail
}
var that = {
isRejected : isRejected ,
isResolved : isResolved ,
resolve : resolve ,
reject : reject ,
done : done ,
fail : fail ,
promise : getPromise
} ;
return that ;
} ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment