function Promise (executor){
this.promiseState = 'pending';
this.promiseResult = null;
this.callbackList = [];
const resolve = val => {
if(this.promiseState !== 'pending') return;
this.promiseState = 'fulfilled';
this.promiseResult = val;
for(let callback of this.callbackList){
callback.onResolved(val);
}
}
const reject = err => {
if(this.promiseState !== 'pending') return;
this.promiseState = 'rejected';
this.promiseResult = err;
for(let callback of this.callbackList){
callback.onRejected(err);
}
}
try{
executor(resolve,reject);
}catch(err){
reject(err);
}
}
Promise.prototype.then = function(onResolved,onRejected){
const self = this;
return new Promise((resolve,reject)=>{
const handleCallback = (callback)=>{
try{
const res = callback(self.promiseResult);
if(res instanceof Promise){
res.then(val => {
resolve(val);
},err => {
reject(err)
})
}else{
resolve(res)
}
}catch(err){
reject(err)
}
}
if(this.promiseState == 'fultilled'){
handleCallback(onResolved);
}
if(this.promiseState == 'rejected'){
handleCallback(onRejected);
}
if(this.promiseState == 'pending'){
this.callbacklist.push({
onResolved:()=>{
handleCallback(onResolved);
},
onRejected:()=>{
handleCallback(onRejected);
},
})
}
})
}
Promise.prototyp.catch = function(onRejected){
return this.then(undefined,onRejected);
}
Promise.resolve = function (val){
return new Promise((resolve,reject) => {
if(val instanceof Promise){
val.then(val => {
resolve(val);l
})
}else{
resolve(value);
}
})
}
Promise.reject = function(err){
return new Promise((resolve,reject) => {
reject(err);
})
}
Promise.all = function(promiseList){
let count = 0;
let res = [];
const length = promiseList.length;
return new Promise((resolve,reject) => {
for(let i=0;i<length;i++){
promiseList[i].then(val => {
count ++;
res[i] = val;
if(count == length){
resolve(res);
}
},err => {
reject(err);
})
}
})
}
Promise.race = function(promisList){
const length = promiseList.length;
return new Promise((resovle,reject)=>{
for(let i=0;i<length;i++){
promiseList[i].then(val => {
resolve(val)
},err => {
reject(err)
})
}
})
}
console