Defer

Apply Partial Deferred Promise

by ethan_selzer

HTML

<h3>Description</h3>
<p>Defer function invocation to an existing promise and return a new promise.</p>
<p>Could be used to convert an existing synchronous function to asyncronous behaviour.</p>

JavaScript

function defer( promise, func, context ){
    return function(){
        var args =  [].slice.apply( arguments ),
            dfd = new $.Deferred();
        
        promise.done( function(){
            var allArgs = args.concat( arguments );
            dfd.resolve( func.apply( context, allArgs ) );
        } );
        
        promise.fail( function(){
            dfd.reject();
        } );
        
        return dfd.promise();
    };
}

function add( a, b ){
  return ( a + b );
}

var obj = {
    baseVal : 4,
    subtractFromBase : function( b ){
        return this.baseVal - b; 
    }
}

var dfd = new $.Deferred();
var promise = dfd.promise();

window.setTimeout( function(){
    dfd.resolve();
}, 3000 );

add = defer( promise, add );
obj.subtractFromBase = defer( promise, obj.subtractFromBase, obj );

add( 3, 6 ).done( function( result ){
    console.log( result );
} );

obj.subtractFromBase( 2 ).done( function( result ){
    console.log( result );
} );