// 声明三种状态机
const STATUS = {
PENDING: 0,
FULFILLED: 1,
REJECTED: 2
}
function Promise(exector){
this.status = STATUS.PEDNDING
// resolve返回的数据
this.resolveData = null
// reject返回的数据
this.rejectData = null
// 缓存成功回调的函数
this.onFulfilledList = []
// 缓存失败回调的函数
this.onRejectedList = []
let self = this;
// 成功时执行
function onResolve(resolveData){
if(self.status === STATUS.PENDING){
self.resolveData = resolveData
self.status = STATUS.FULFILLED
self.onFulfilledList.forEach(fn=>fn())
}
}
//失败时执行
function onReject(rejectData ){
if(self.status === STATUS.PENDING){
self.rejectData = rejectData
self.status = STATUS.REJECTED
self.onRejectedList.forEach(fn=fn())
}
}
try {
exector(onResolve, onReject)
}catch(e){
onReject(e)
}
}
// 添加then 方法
Promise.prototype.then = function(onSucess, onError){
let self = this
if(this.status === STATUS.FULFILLED){
onSucess(self.resolveData)
}
if(this.status === STATUS.REJECTED){
onError(self.rejectData)
}
// 如果异步执行则为pending 状态
if(this.status === STATUS.PENDING){
// 保存回调函数
this.onFulfilledList.push(()=>{
onSucess(self.resolveData)
})
this.onRejectedList.push(()=>{
onError(self.rejectData)
})
}
}
手写一个promise
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这里我们先啰嗦一下Promise的概念:什么是promise Promise 是异步编程的一种解决方案,比传统的解...
- 前言 JSONP以前研究过,最近又有点忘了,写篇本文mark一下,旨在理解记住JSONP的原理及其实现。代码实现用...
- Promise标准了解一下 传送门1⃣️ 👉Promises/A+规范 传送门2⃣️ 👉阮一峰前辈ECMAScri...