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
| function myPromise(fn) { var state = 'pending', value = null, callbacks = [];
this.then = function(onFulfilled = null){ return new Promise((resolve)=>{ handle({ onFulfilled, resolve }) }) } function handle(callback) { if(state == 'pending') { callbacks.push(callback) return } if(!callback.onFulfilled) { callback.resolve(value) return } var ret = callback.onFulfilled(value) callback.resolve(ret) } function resolve(newValue) { if(newValue && typeof newValue == 'function' || typeof newValue == 'object'){ var then = newValue.then if(newValue.then){
then.call(newValue, resolve) } } state = 'fulfilled'; value = newValue setTimeout(()=>{ callbacks.map((cb)=>{ handle(cb) }) },0) } fn(resolve) }
|