实现状态的变化主要分为下面几种:
1.传入一个函数并立即调用,如果遇到错误就直接改变状态
2.实现resolve和rejected,这两个函数是用来改变状态和数据,应为这两个函数是直接调用的,所以在任务执行器中提前绑定了this的指向
3.优化代码层面:
(1)定义了三个常量来表示状态,方便后续的使用
(2)改变状态和数据需要复用,专门定义了一个方法来实现
代码实现:
// 记录Promise的三种状态
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyPromise {
/**
* 创建一个Promise
* @param {Function} executor 任务执行器 立即执行
*/
constructor(executor) {
this._state = PENDING // 状态
this._value = undefined // 数据
try {
// 如果在执行期间发生错误 直接改变状态
executor(this._resolve.bind(this), this._reject.bind(this))
} catch (error) {
this._reject(error)
}
}
/**
* 更改任务状态和数据
* @param {String} newState // 新状态
* @param {any} value // 数据
*/
_changeState(newState, value) {
if (this._state !== PENDING) {
// 目前状态已经更改 直接返回
return
}
this._state = newState
this._value = value
}
/**
* 标记当前任务完成
* @param {any} data 任务完成的相关数据
*/
_resolve(data) {
// 改变状态和数据
this._changeState(FULFILLED, data)
}
/**
* 标记当前任务失败 任务失败的相关数据
* @param {any} reason
*/
_reject(reason) {
// 改变状态和数据
this._changeState(REJECTED, reason)
}
}
调用:
const pro = new MyPromise((resolve, reject) => {
throw new Error(13)
})
console.log(pro)
747

被折叠的 条评论
为什么被折叠?



