JSFiddle - React, Tailwind, and code Playground

JavaScript

var task = (function($){

    var dfd = $.Deferred(),
        cls = function(){
            
            console.log('param passed:', arguments);
            
            for(var i = 0; i < 5; i++){
                
                var count = 0;
                
                setTimeout(function(){   
                    
                    count++;
                    
                    dfd.notify({ msg: 'interation ' + count + ' complete' });
                    
                    if(count === 5)
                        dfd.resolve({ something: 1 });
                    
                    //if anything goes wrong, you can always reject the deferred:
                    //dfd.reject(args); 
                    
                }, 1000 * i);
               
            }
        };

    cls.prototype = {
        done: dfd.promise().done,
        fail: dfd.promise().fail,
        always: dfd.promise().always,
        progress: dfd.promise().progress
    };
    
    return cls;

})(jQuery);

var t = new task({ foo: 'bar' }, 123, 'baz');

t.progress(function(data){
    console.log('progress:', data);
}).done(function(){
    console.log('done');
}).fail(function(){
    console.log('fail');
}).always(function(){
    console.log('always');
});