手写promise

js函数式

function MyPromise(excutor) {
    const self = this
    // 状态
    self.status = 'pedding'
    // 成功的结果
    self.value = null
    // 失败的结果
    self.reason = null

    self.onFulfilledCallbacks = []
    self.onRejectedCallbacks = []
    
    // 成功
    function resolve(value) {
        if (self.status === 'pedding') {
            self.value = value
            self.status = 'fulfilled'
            self.onFulfilledCallbacks.forEach(item => item(value))
        }
    }

    // 失败的
    function reject(reason) {
        if (self.status === 'pedding') {
            self.reason = reason
            self.status = 'fulfilled'
            self.onRejectedCallbacks.forEach(item => item(reason))
        }
    }
    
    try {
        excutor(resolve, reject)
    } catch(err) {
        reject(err)
    }

}

MyPromise.prototype.then = function(onFulfilled, onRejected) {
    const self = this
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(data){resolve(data)} 
    onRejected = typeof onRejected === 'function' ? onRejected : function(err){throw err} 
    if (self.status === 'pedding') {
        self.onFulfilledCallbacks.push(onFulfilled)
        self.onRejectedCallbacks.push(onRejected)
    }
}

const result = new MyPromise((resolve, reject) => {
    console.log('这是自己写的promise')
    setTimeout(() => {
        console.log('这是promise实例中的setTimeout')
        resolve('这是promise实例中的setTimeout   resolve')
    }, 1000)
})
result.then(res => {
    console.log(res)
}, err => {
    console.log(err)
})

js class类

class MyPromise {
    status = 'pedding'
    value = null
    reason = null
    onFulfilledCallBacks = []
    onRejectedCallBacks = []

    constructor(excutor) {
        excutor(this.resolve, this.reject)
    }

    resolve = (value) => {
        if (this.status === 'pedding') {
            this.value = value
            this.status = 'fulfilled'
            this.onFulfilledCallBacks.forEach(item => item(value))
        }
    }

    reject = (reason) => {
        if (this.status === 'pedding') {
            this.reason = reason
            this.status = 'rejected'
            this.onRejectedCallBacks.forEach(item => item(reason))
        }

    }
}
MyPromise.prototype.then = function(onFulfilled, onRejected) {
    const self = this
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(data){resolve(data)}
    onRejected = typeof onRejected === 'function' ? onRejected : function(err) {throw err}
    if (self.status === 'pedding') {
        self.onFulfilledCallBacks.push(onFulfilled)
        self.onRejectedCallBacks.push(onRejected)
    }
}

const result = new MyPromise((resolve, reject) => {
    console.log('1')
    setTimeout(() => {
        console.log('2')
        // resolve('3')
        reject('错误的')
        
    }, 1000)
    console.log('4')
    
    
})

result.then((res) => {
    console.log(res, '1')
}, err => {
    console.log(err, '2')
})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值