Skip to content

Instantly share code, notes, and snippets.

@freddi301
Created January 9, 2019 10:58
Show Gist options
  • Select an option

  • Save freddi301/aad01724f2359d9d9ca22a8b045848ce to your computer and use it in GitHub Desktop.

Select an option

Save freddi301/aad01724f2359d9d9ca22a8b045848ce to your computer and use it in GitHub Desktop.
naive javascript promise
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