1. 程式人生 > 實用技巧 >Promise 實現,因為無法模擬微任務, 幹錯沒用非同步

Promise 實現,因為無法模擬微任務, 幹錯沒用非同步

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'; });