建構值
我們使用 Promise 的方式:new Promise((resolve) => resolve());
一開始建立的時候會拿到一個 callback,這個 callback 擁有兩個 function
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
| class Promise { constructor(callback) { this.status = "pending"; this.value = ""; this.onFulfilledCallbacks = []; this.onRejectedCallbacks = []; const resolve = (value) => { if (this.status === "pending") { this.status = "fulfilled"; this.value = value; this.onFulfilledCallbacks.forEach((fn) => fn(value)); } };
const reject = (value) => { if (this.status === "pending") { this.status = "rejected"; this.value = value; this.onRejectedCallbacks.forEach((fn) => fn(value)); } };
try { callback(resolve, reject); } catch (err) { reject(err); } }
then(onFulfilled, onRejected) { return new Promise((resolve, reject) => { if (this.status === "pending") { this.onFulfilledCallbacks.push(() => { try { const fulfilledFromLastPromise = onFulfilled(this.value); if (fulfilledFromLastPromise instanceof Promise) { fulfilledFromLastPromise.then(resolve, reject); } else { resolve(fulfilledFromLastPromise); } } catch (err) { reject(err); } }); this.onRejectedCallbacks.push(() => { try { const rejectedFromLastPromise = onRejected(this.value); if (rejectedFromLastPromise instanceof Promise) { rejectedFromLastPromise.then(resolve, reject); } else { reject(rejectedFromLastPromise); } } catch (err) { reject(err); } }); }
if (this.status === "fulfilled") { try { const fulfilledFromLastPromise = onFulfilled(this.value); if (fulfilledFromLastPromise instanceof Promise) { fulfilledFromLastPromise.then(resolve, reject); } else { resolve(fulfilledFromLastPromise); } } catch (err) { reject(err); } }
if (this.status === "rejected") { try { const rejectedFromLastPromise = onRejected(this.value); if (rejectedFromLastPromise instanceof Promise) { rejectedFromLastPromise.then(resolve, reject); } else { reject(rejectedFromLastPromise); } } catch (err) { reject(err); } } }); } }
|