Promise实现
Promise实现:最难的部分感觉是不同实现的Promise之间的交互,代码看不懂,暂时不加那部分的代码
function Promise (executor){
var self = this
self.status = 'pending'
self.data = null
self.onResolvedCallBack = []
self.onRejectedCallBack = []
function reslove(value){
if(self.status === 'pending'){
self.status = 'fulfilled'
self.data = value
self.onResolvedCallBack.forEach(cb => cb(value))
}
}
function reject(reason){
if(self.status === 'pending'){
self.status = 'rejected'
self.data = reason
self.onRejectedCallBack.forEach(cb => cb(reason))
}
}
try{
executor(reslove,reject)
}catch(e){
reject(e)
}
}
Promise.prototype.then = function(onResolved,onRejected){
let self = this
let promise2
onResolved = typeof onResolved === 'function' ? onResolved : value => { return value }
onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
if(self.status === 'fulfilled'){
return promise2 = new Promise((reslove,reject) => {
try{
var x = onResolved(self.data)
if(x instanceof Promise){
x.then(reslove,reject)
}else{
reslove(x)
}
}catch(e){
reject(e)
}
})
}
if(self.status === 'rejected'){
return promise2 = new Promise((reslove,reject) => {
try{
var x = onRejected(self.data)
if(x instanceof Promise){
x.then(reslove,reject)
}else{
reslove(x)
}
}catch(e){
reject(e)
}
})
}
if(self.status === 'pending'){
return promise2 = new Promise((reslove,reject) => {
self.onResolvedCallBack.push(function(value){
try{
var x = onResolved(value)
if(x instanceof Promise){
x.then(reslove,reject)
}else{
reslove(x)
}
}catch(e){
reject(e)
}
})
self.onRejectedCallBack.push(reason => {
try{
var x = onRejected(reason)
if(x instanceof Promise){
x.then(reslove,reject)
}else{
reslove(x)
}
}catch(e){
reject(e)
}
})
})
}
}
Promise.prototype.catch = function(onRejected){
return this.then(null,onRejected)
}
/**
* 不同之间的Promise之间交互目前实在是看不太懂,暂时不加上那部分代码
*/
Promise.resolve = value => {
return new Promise((resolve,reject) => {resolve(value)})
}
Promise.reject = reason => {
return new Promise((reslove,reject) => {reject(reason)})
}
Promise.all = promises => {
return new Promise((reslove,reject) => {
let values = []
let count = 0
promises.forEach((promise,index,promises) => {
promise.then(value => {
values[index] = value
count++
if(count === promises.length){
resolve(values)
}
},reject)
})
})
}
Promise.race = promises => {
return new Promise((reslove,reject) => {
promises.forEach(promise => {
promise.then(reslove,reject)
})
})
}
Promise.allSettled = promises => {
return new Promise((resolve) => {
let values = []
let count = 0
promises.forEach((promise,index,promises) => {
promise.then(value => {
values[index] = value
}).catch(error => {
values[index] = error
}).finally(() => {
++count
if(count == promises.length){
resolve(values)
}
})
})
})
}
Promise.any = promises => {
return new Promise((resolve,reject) => {
let count = 0
let arr = []
promises.forEach(promise => {
promise.then(res => {
resolve(res)
}).catch(err => {
++count
arr.push(err)
if(count == promises.length){
reject(arr)
}
})
})
})
}
以自己现在的努力程度,还没有资格和别人拼天赋

浙公网安备 33010602011771号