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 128 129
| class _Promise { constructor (executor) { this.status = 'pending' // pending , resolved, rejected this.value = null // 处理异步后的值 this.reason = null // 异常保留值 this.resolveCallBackList = [] this.rejectCallBackList = [] this.isHasCatch = false this.CatchFunc = null let self = this
function resolve(val) { if (self.status === 'pending') { self.status = 'resolved' self.value = val self.resolveCallBackList.forEach(fun =>fun()); } }
function reject(val) { if (self.status === 'pending') { self.status = 'rejected' self.value = val self.rejectCallBackList.forEach(fun => fun()); } } try { executor(resolve,reject) } catch (error) { console.log('init ') if (this.isHasCatch) { this.CatchFunc(error) } else { reject(error) } } }
then(infulfilled, inrejected) { let self = this let p2 ;
infulfilled = typeof infulfilled === 'function' ? infulfilled : function (val) { return val } inrejected = typeof inrejected === 'function' ? inrejected : function (err) { throw err }
if (self.status === 'resolve') { p2 = new _Promise((resolve, reject) => { setTimeout(() => { try { let x = infulfilled(self.value) self.resolvePromise(p2, x, resolve, reject) } catch (error) { console.log('then resolve ') if (this.isHasCatch) { this.CatchFunc(error) } else { reject(error) } } }); }) }
if (self.status === 'rejected') { p2 = new _Promise((resolve,reject) => { setTimeout(() => { try { let x = inrejected(self.reason) self.resolvePromise(p2,x,resolve,reject) } catch (error) { reject(error) } }); }) }
if (self.status === 'pending') { p2 = new _Promise((resolve,reject) => { setTimeout(() => { try { self.resolveCallBackList.push(() => { let x = infulfilled(self.value) self.resolvePromise(p2,x,resolve,reject) })
self.rejectCallBackList.push(() => { let x = inrejected(self.reason) self.resolvePromise(p2,x,resolve,reject) }) } catch (error) { reject(error) } }); }) } return p2 }
resolvePromise(p2,x,resolve,reject) { let self = this if (p2 === x && x !== undefined) reject(new Error('类型错误'))
if (x !== null && (typeof x === 'object' || typeof x === 'function')) { try { let then = x.then if (typeof then === 'function') { then.call(x, function (y) { self.resolvePromise(p2,y,resolve,reject) }) } else { resolve(x) } } catch (error) { reject(error) } } else { resolve(x) } }
catch(handleError) { return this.then(undefined,handleError) } }
|