Promise
赵钊 2023/5/15
# Promise/A+ 中文文档
# 1. promise解读
只有一个then方法,没有catch,race,all等方法,甚至没有构造函数
Promise标准中仅指定了Promise对象的then方法的行为,其它一切我们常见的方法/函数都并没有指定,包括catch,race,all等常用方法,甚至也没有指定该如何构造出一个Promise对象,另外then也没有一般实现中(Q, $q等)所支持的第三个参数,一般称onProgress
then方法返回一个新的Promise,而不是返回this
不同Promise的实现需要可以相互调用(interoperable)
Promise的初始状态为pending,它可以由此状态转换为fulfilled(本文为了一致把此状态叫做resolved)或者rejected,一旦状态确定,就不可以再次转换为其它状态,状态确定的过程称为settle
# 2.代码
class MyPromise {
constructor(executor) {
this.STATE = 'pending'
this.value = undefined
this.reson = undefined
this.reslovedCallbacks = []
this.rejectedCallbacks = []
const resloved = (value) => {
if (this.STATE === 'pending') {
this.STATE = "fulfilled"
this.value = value
this.reslovedCallbacks.forEach(fn => fn(value))
}
}
const rejected = (error) => {
if (this.STATE === 'pending') {
this.STATE = "rejected"
this.reson = error
this.rejectedCallbacks.forEach(fn => fn(error))
}
}
try {
executor(resloved, rejected)
} catch (error) {
rejected(error)
}
}
}
MyPromise.prototype.then = function(onResloved, onRejected){
const self = this
return new MyPromise((reslove, reject) => {
function callback(type) {
try {
let result;
if (type === onResloved) {
result = type(self.value)
} else if (type === onResloved) {
result = type(self.error)
}
console.log(123,type,result)
if (result instanceof MyPromise) {
result.then(val => {
reslove(val)
}, err => {
reject(err)
})
} else {
reslove(result)
}
} catch (e) {
reject(e)
}
}
if (this.STATE === "fulfilled") {
callback(onResloved)
}
if (this.STATE === "rejected") {
callback(onRejected)
}
if (this.STATE === "pending") {
self.reslovedCallbacks.push(function (value) {
callback(onResloved)
})
self.rejectedCallbacks.push(function (reason) {
callback(onRejected)
})
}
})
}