Promise 简化版实现 resolve reject throw回调
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('OK')
},1000)
})
function Promise(executor){
this.PromiseState = 'pending'
this.PromiseResult = null
const self = this
this.callbacks = []
function resolve(data){
self.PromiseState = 'fulfilled'
self.PromiseResult = data
}
function reject(data){
self.PromiseState = 'rejected'
self.PromiseResult = data
}
try{
executor(resolve,reject)
}catch(e){
reject(e)
}
}
promise完整版实现
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('OK')
},1000)
})
p.then(value=>{
console.log(value)
},reason=>{
console.log(reason)
})
p.catch(reason=>{
console.warn(reason)
})
function Promise(executor){
this.PromiseState = 'pending'
this.PromiseResult = null
const self = this
this.callbacks = []
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 = 'rejected'
self.PromiseResult = data
self.callbacks.forEach(item=>{
item.onRejected(data)
})
}
try{
executor(resolve,reject)
}catch(e){
reject(e)
}
}
Promise.prototype.then= function(onResolve,onRejected){
const self = this
if(typeof onRejected !== 'function'){
onRejected = reason=>{
throw reason
}
}
if(typeof onResolved !== 'function'){
onResolved = value=>{
return value
}
}
return new Promise((resolve,reject)=>{
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(e){
reject(e)
}
}
if(this.PromiseState == 'fulfilled'){
callback(onResolved)
}
if(this.PromiseState == 'rejected'){
onRejected(this.PromiseResult)
}
if(this.PromiseState == 'pending'){
this.callbacks.push({
onResolved:function(){
callback(onResolved)
},
onRejected:function(){
callbacck(onRejected)
}
})
}
})
}
Promise.prototype.catch = function(onRejected){
return this.then(undefined,onRejected)
}