1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| function MyPromise(fn){ let _this = this; _this.status = 'pending'; _this.value = undefined; function resolved(val){ _this.status = 'resolved'; _this.value = val; } function rejected(err){ _this.status = 'rejected'; _this.value = err; } fn(resolved,rejected); } MyPromise.prototype.then = function(onResolved,onRejected){ let newPromise; let _this = this; onResolved = typeof onResolved === 'function' ? onResolved : function(value){return value;}; onRejected = typeof onRejected === 'function' ? onRejected : function(err){return err;};
if(_this.status === 'resolved'){ return (newPromise = new MyPromise(function(resolved,rejected){ let result = onResolved(_this.value); if(result instanceof MyPromise){ result.then(resolved,rejected); }else{ resolved(result); } })); } if(_this.status === 'rejected'){ return (newPromise = new MyPromise(function(resolved,rejected){ let result = onRejected(_this.value); if(result instanceof MyPromise){ result.then(resolved,rejected); }else{ resolved(result); } })); } };
let p = new MyPromise(function(resolved,rejected){ resolved('hello'); }); console.log(p); let p1 = p.then((data)=>{ return new MyPromise(function(resolved,rejected){ rejected(new Error('Oh,I am Error!!!')); }); }); console.log(p1); let p2 = p1.then(function(data){ return 'data:' + data; },function(err){ return 'err:' + err; }); console.log(p2); let p3 = p.then().then(function(data){}); console.log(p3);
|