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
| function Promise(executor) { let self = this this.status = 'pending' this.value = undefined this.reason = undefined this.onResolvedCallbacks = [] this.onRejectedCallbacks = [] function resolve(value) { if (self.status == 'pending') { self.status = 'resolved' self.value = value self.onResolvedCallbacks.forEach(fn => fn()); } } function reject(error) { if (self.status == 'pending') { self.status = 'rejected' self.reason = error self.onRejectedCallbacks.forEach(fn => fn()) } } try { executor(resolve, reject) } catch (error) { reject(error) } } Promise.prototype.then = function (infulfilled, inrejected) { let self = this let promise2 infulfilled = typeof infulfilled === 'function' ? infulfilled : function (val) { return val } inrejected = typeof inrejected === 'function' ? inrejected : function (err) { throw err } if (this.status == 'resolved') { promise2 = new Promise(function (resolve, reject) { setTimeout(function () { try { let x = infulfilled(self.value) resolvePromise(promise2, x, resolve, reject) } catch (err) { reject(err) } });
}) } if (this.status == 'rejected') {
promise2 = new Promise(function (resolve, reject) { setTimeout(function () { try { let x = inrejected(self.reason) resolvePromise(promise2, x, resolve, reject) } catch (err) { reject(err) } }); }) } if (this.status == 'pending') { promise2 = new Promise(function (resolve, reject) { self.onResolvedCallbacks.push(function () { setTimeout(function () { try { let x = infulfilled(self.value) resolvePromise(promise2, x, resolve, reject) } catch (err) { reject(err) } }); }) self.onRejectedCallbacks.push(function () { setTimeout(function () { try { let x = inrejected(self.reason) resolvePromise(promise2, x, resolve, reject) } catch (err) { reject(err) } }); }) }) } return promise2 } function resolvePromise(p2, x, resolve, reject) { if (p2 === x && x != undefined) { reject(new TypeError('类型错误')) }
if (x !== null && (typeof x === 'object' || typeof x === 'function')) { try { let then = x.then if (typeof then === 'function') { then.call(x, function (y) { resolvePromise(p2, y, resolve, reject) }, function (err) { reject(err) }) } else { resolve(x) } } catch (e) { reject(e) } } else { resolve(x) } }
|