const PENDING = 'pending';
const RESOLVED = 'resolved';
const REJECTED = 'rejected';
function MyPromise(constructor) {
const me = this;
me.status = PENDING;
me.value = null;
me.reason = null;
me.resolveTasks = [];
me.rejectTasks = [];
function resolve(value) {
if(me.status === PENDING) {
me.value = value;
me.status = RESOLVED;
me.resolveTasks.map(cb => cb(me.value));
}
}
function reject(reason) {
if(me.status === PENDING) {
me.reason = reason;
me.status = REJECTED;
me.rejectTasks.map(cb => cb(me.reason));
}
}
try {
constructor(resolve, reject);
} catch (error) {
reject(error);
}
}
MyPromise.prototype.then = function (onFulfilled, onRejected) {
const me = this;
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : v => v;
onRejected = typeof onRejected === 'function' ? onRejected : e => {
throw e;
}
if(me.status === RESOLVED) {
onFulfilled(me.value);
}
if(me.status === REJECTED) {
onRejected(me.reason);
}
if(me.status === PENDING) {
me.resolveTasks.push(onFulfilled);
me.rejectTasks.push(onRejected);
}
}
MyPromise.all = function(promises) {
const arr = [];
return new MyPromise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
promises[i].then(res => {
arr[i] = res;
if(i === promises.length - 1) {
resolve(arr);
}
}, reject)
}
})
}