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
| function promise(fn){ var that = this; var state = 'pending'; var callbacks = [] var value; function resolve(newValue){ console.log(newValue); state = 'fulfilled'; value = newValue console.log('-----------') setTimeout(function () { callbacks.forEach(function (callback) { handle(callback); }); }, 0); } function handle(obj = {}){ console.log(state); if(state == 'pending'){ callbacks.push(obj) return } if(!obj.onFulfilled) { obj.resolve(value); return; } var ret = obj.onFulfilled(value); obj.resolve(ret) } this.then = (onFulfilled)=>{ console.log(2); return new promise((resolve)=>{ console.log(3); handle({ onFulfilled:onFulfilled, resolve:resolve }) }) } fn(resolve) console.log(4); } new promise((res)=>{ console.log(1); setTimeout(() => { res(111) }, 1000); }).then((data)=>{ return new promise((res)=>{ console.log(6) setTimeout(() => { res(222) }, 1000); }) }).then((data)=>{ console.log(5); setTimeout(() => { console.log(333); }, 1000); })
|