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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
class MyPromise { constructor(fn) { if (typeof fn !== "function") { throw new Error('MyPromise Expect A Function') }
this.status = 'Pending'; this.onResolvedCallback = []; this.onRejectedCallback = []; this.val = undefined;
const resolve = (val) => { setTimeout(() => { console.log(this.status, this.onResolvedCallback) if(this.status === 'Pending') { this.status = 'Resolved' this.val = val; this.onResolvedCallback.forEach(item => item(val)) } }, 0) }
const reject = (val) => { setTimeout(() => { if(this.status === 'Pending') { this.status = 'Rejected' this.val = val; this.onRejectedCallback.forEach(item => item(val)) } }, 0) }
try { fn(resolve, reject) } catch (e) { reject(e); }
return this.status; }
then(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : o => o; onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err };
return new MyPromise((resolve, reject) => { this.onResolvedCallback.push((val) => { try { const res = onFulfilled(val) if(res instanceof MyPromise) { res.then(resolve, reject) } else { resolve(res); } } catch (e) { reject(e); } })
this.onRejectedCallback.push((val) => { try { const res = onRejected(val) if(res instanceof MyPromise) { res.then(resolve, reject) } else { reject(res); } } catch (e) { reject(e); } }) }) }
catch(onRejected) { return this.then(null, onRejected); } }
const p = new MyPromise((res, rej) => {res(1)})
p.then(3) .then(cal => { console.log(cal) }) .catch(err=> { console.log(err) })
|