Created
January 9, 2019 10:58
-
-
Save freddi301/aad01724f2359d9d9ca22a8b045848ce to your computer and use it in GitHub Desktop.
naive javascript promise
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const status = Symbol(); | |
| const value = Symbol(); | |
| const set = Symbol(); | |
| const listeners = Symbol(); | |
| class Promise { | |
| constructor(callback) { | |
| this[listeners] = []; | |
| this[status] = "pending"; | |
| const resolve = value => { | |
| if (value instanceof Promise) value.then(resolve, reject); | |
| else this[set]("resolved", value); | |
| }; | |
| const reject = error => { | |
| if (value instanceof Promise) value.then(resolve, reject); | |
| else this[set]("rejected", error); | |
| }; | |
| callback(resolve, reject); | |
| } | |
| [set](state, data) { | |
| if (this[status] !== "pending") return; | |
| this[status] = state; | |
| this[value] = data; | |
| for (listener of this[listeners]) listener(); | |
| delete this[listeners]; | |
| } | |
| then(onResolve, onReject) { | |
| return new Promise((resolve, reject) => { | |
| const callBack = (callback, reason) => { | |
| try { | |
| if (!callback) { | |
| reason(this[value]); | |
| } else { | |
| const value = callback(this[value]); | |
| if (value instanceof Promise) value.then(resolve, reject); | |
| else resolve(value); | |
| } | |
| } catch (error) { | |
| reject(error); | |
| } | |
| }; | |
| const check = () => { | |
| switch (this[status]) { | |
| case "resolved": | |
| callBack(onResolve, resolve); | |
| break; | |
| case "rejected": | |
| callBack(onReject, reject); | |
| break; | |
| case "pending": | |
| this[listeners].push(check); | |
| break; | |
| } | |
| }; | |
| setTimeout(check); | |
| }); | |
| } | |
| static resolve(value) { | |
| return new Promise((resolve, reject) => resolve(value)); | |
| } | |
| static reject(value) { | |
| return new Promise((resolve, reject) => reject(value)); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment