手写一个Promise
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
| const STATUS_PENDING = "pending"; const STATUS_FULFILLED = "fulfilled"; const STATUS_REJECTED = "rejected";
class myPromise { constructor(executor) { this.status = STATUS_PENDING; this.res = ""; this.err = "";
this.onResCallbacks = []; this.onErrCallbacks = [];
let resolve = (res) => { if (this.status === STATUS_PENDING) { this.status = STATUS_FULFILLED; this.res = res; this.onResCallbacks.forEach((fn) => { fn(); }); } };
let reject = (err) => { if (this.status === STATUS_PENDING) { this.status = STATUS_REJECTED; this.err = err; this.onErrCallbacks.forEach((fn) => { fn(); }); } };
try { executor(resolve, reject); } catch (err) { reject(err); } } then(onRes = () => {}) { if (this.status === STATUS_FULFILLED) { onRes(this.res); } if (this.status === STATUS_PENDING) { this.onResCallbacks.push(() => onRes(this.res)); } return this; }
catch(onErr = () => {}) { if (this.status === STATUS_REJECTED) { onErr(this.err); } if (this.status === STATUS_PENDING) { this.onErrCallbacks.push(() => onErr(this.err)); } return this; } }
|