JSFiddle - React, Tailwind, and code Playground
by Stepan Parunashvili
JavaScript
function identity(x) {
return x;
}
function toPromise(value) {
if (value instanceof MyPromise) {
return value;
} else {
return new MyPromise((resolve, reject) => resolve(value));
}
}
class MyPromise {
constructor(fn) {
// status -- 'pending' | 'reject' | 'resolve';
this.state = {status: 'pending'};
this.handlers = {
resolved: null,
rejected: null,
};
this.queue = [];
const completePromises = (ps) => {
const {status, value} = this.state;
const doAction = unwrappedV => {
ps.forEach(p => {
const f = p.handlers[status] || identity;
const res = f(value);
p[status](res);
});
}
if (value instanceof MyPromise) {
value.then(
x => doAction(x),
x => doAction(x),
);
}
}
this.states = {
pending: {
then: (succCb, failCb) => {
const p = new MyPromise();
p.handlers = {resolve: succCb, reject: failCb};
this.queue.push(p);
return p;
},
resolve: (v) => {
this.state = {status: 'resolve', value: v};
completePromises(this.queue);
},
reject: (v) => {
this.state = {status: 'reject', value: v};
completePromises(this.queue);
}
},
rejected: {
then: (succCb, failCb) => {
},
resolve: (v) => {
},
reject: (v) => {
},
finally: () => {
}
},
resolved: {
then: (succCb, failCb) => {
},
resolve: (v) => {
},
reject: (v) => {
}
}
}
this.then = (succCb, failCb) => {
return this.states[this.state.status].then(succCb, failCb);
}
this.resolve = (v) => {
this.states[this.state.status].resolve(v);
}
this.reject = (v) => {
this.states[this.state.status].reject(v);
}
fn && fn(this.resolve,...