function Then(fn){ var __self__ = this; this.node = null; this.err = null; this.catchFn = null; this.endFn = null; this.running = true; this.queue = []; fn(function(value){ __self__._res(value); }, function(value){ __self__._rej(value); }); } Then.prototype._next = function(){ var __self__ = this; var callback = arguments.callee; if(this.queue.length == 0){ this.running = false; this.endFn && this.endFn.call(this, this.node); return; } var node; this.running = true; if(this.node.constructor === Then){ this.node.end(function(value){ node = value; __self__.node = node; __self__.running = false; if(__self__.queue.length > 0){ callback.call(__self__); } }) }else{ var fn = this.queue.shift(); node = fn(this.node); this.node = node; this.running = false; if(this.queue.length > 0){ callback.call(this); } } } Then.prototype._res = function(value){ this.node = value; this._next(); return this; } Then.prototype._rej = function(value){ this.err = value; return this; } Then.prototype.then = function(fn){ this.queue.push(fn); if(!this.running){ this._next(); } return this; } Then.prototype.end = function(fn){ this.endFn = fn; this._next(); return this; } Then.prototype.catch = function(value){ } new Then(function(res, rej){ setTimeout(function(){ console.log(1); res(true) },1000) }).then(function(){ return new Then(function(res, rej){ res('2'); }).then(function(data){ return '3'; }); }).then(function(data){ console.log(4); console.log(data); return '3'; });