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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| const PENDING = 'PENDING' const FULFILLED = 'FULFILLED' const REJECTED = 'REJECTED'
class Promise { constructor(executor) { this.status = PENDING this.value = undefined this.reason = undefined this.onFulfilledCallbacks = [] this.onRejectedCallbacks = []
const resolve = value => { if (this.status === PENDING) { this.status = FULFILLED this.value = value this.onFulfilledCallbacks.forEach(fn => fn(this.value)) } }
const reject = reson => { if (this.status === PENDING) { this.status = REJECTED this.reason = reason this.onRejectedCallbacks.forEach(fn => fn(this.reason)) } }
try { executor(resolve, reject) } catch (e) { reject(e) } }
then(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw new Error( reason instanceof Error ? reason.message : reason) }
const self = this return new Promise((resolve, reject) => { if (self.status === PENDING) { self.onFulfilledCallbacks.push(() => { try { setTimeout(() => { const result = onFulfilled(self.value) result instanceof Promise ? result.then(resolve, reject) : resolve(result) }, 0) } catch (e) { reject(e) } }) self.onRejectedCallbacks.push(() => { try { setTimeout(() => { const result = onRejected(self.reason) result instanceof Promise ? result.then(resolve, reject) : reject(result) }, 0) } catch (e) { reject(e) } }) } else if (self.status === FULFILLED) { try { setTimeout(() => { const result = onFulfilled(self.value) result instanceof Promise ? result.then(resolve, reject) : resolve(result) }, 0) } catch (e) { reject(e) } } else if (self.status === REJECTED) { try { setTimeout(() => { const result = onRejected(self.reason) result instanceof Promise ? result.then(resolve, reject) : reject(result) }) } catch (e) { reject(e) } } }) }
catch(onRejected) { return this.then(null, onRejected) }
static resolve(value) { if (value instanceof Promise) { return value } else { return new Promise((resolve, reject) => resolve(value)) } } static reject(reason) { return new Promise((resolve, reject) => { reject(reason) }) } }
|