function Promise(executor) {
this.PromiseState = 'pending';
this.PromiseResult = null;
this.callbacks = [];
const self = this;
function resolve(data) {
if (self.PromiseState !== 'pending') return
self.PromiseState = 'fulfilled';
self.PromiseResult = data;
self.callbacks.forEach(item => {
item.onResolved(data)
})
}
function reject(data) {
if (self.PromiseState !== 'pending') return
self.PromiseState = 'reject';
self.PromiseResult = data;
self.callbacks.forEach(item => {
item.onRejected(data)
})
}
try {
executor(resolve, reject)
} catch (error) {
reject(error)
}
}
Promise.prototype.then = function (onResolved, onRejected) {
const self = this;
return new Promise((resolve, reject) => {
if(typeof onRejected !== 'function'){
onRejected = reason =>{
throw reason
}
}
if(typeof onResolved !== 'function'){
onResolved = value => value
}
function callback(type){
try {
let result = type(self.PromiseResult)
if (result instanceof Promise) {
result.then(v => {
resolve(v)
}, r => {
reject(r)
})
} else {
resolve(result)
}
} catch (error) {
reject(error)
}
}
if (this.PromiseState === 'fulfilled') {
callback(onResolved)
}
if (this.PromiseState === 'reject') {
callback(onRejected)
}
if (this.PromiseState === 'pending') {
this.callbacks.push({
onResolved: function () {
callback(onResolved)
},
onRejected: function () {
callback(onRejected)
},
})
}
})
}
Promise.prototype.catch = function(onRejected){
return this.then(undefined,onRejected)
}
Promise.resolve = function(value){
return new Promise((resolve,reject) => {
if(value instanceof promise){
value.then(v => {
resolve(v)
},r => {
reject(r)
})
}else{
resolve(value)
}
})
}
Promise.reject = function(reason){
return new Promise((resolve,reject) => {
reject(reason)
})
}
Promise.all = function(promises){
return new Promise((resolve,reject) => {
let count = 0;
let arr = [];
for(let i = 0;i < promises.length; i++){
promises[i].then(v => {
arr[i] = v;
count++;
if(count === promises.length){
resolve(arr);
}
},r => {
reject(r);
})
}
})
}