I think you can try a technique called Monad . But what is a monad ? I cannot explain it properly.
So, "Please show me the code!"
We have some asynchronous functions in the pipequeue array, each function in the pipequeue must be a deferred instance. the function may be asynchronous. they will be executed one by one.
as follows: drop explode drop2 explode2 are four asynchronous animation processes, each of which returns a jQuery promise .
full code is in jsbin: http://jsbin.com/ikovof/2/
var $el = $("#foo"); function drop(){ var defer = Deferred() , promise = defer.promise() $el.html("GO"); $el.show("drop",{ complete:function(){ defer.resolve(); } },1000) return promise; } function explode(){ var defer = Deferred() , promise = defer.promise() $el.hide("explode",{ complete:function(){ defer.resolve(); } },1000) return promise; } function drop2(){ var defer = Deferred() , promise = defer.promise() $el.html("WENT"); $el.show("drop",{ complete:function(){ defer.resolve(); } },1000) return promise; } function explode2(){ var defer = Deferred() , promise = defer.promise() $el.hide("explode",{ complete:function(){ defer.resolve(); } },1000) return promise; } var pipequeue = [drop,explode,drop2] pipequeue.push(explode2); pipe(unit(),pipequeue);
You can push or pop pipequeue . every fn in pipequeue has no connection!
But if you think that pipe(unit(),pipequeue) little ...
you can wrap the unit() call in a function:
function pipePromise(pipequeue){ pipe(unit(),pipequeue); }