• 手写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')
    })
    
  • 相关阅读:
    DCDC导致EMI辐射超标整改案例分享
    计算机网络 | socket IPC(本地套接字domain)
    AWD比赛中的一些防护思路技巧
    Vue 3是一个错误,我们不应该再犯。
    精选北京十大律师事务所最新排名榜(2022可参考)
    努力奋斗,遇上对的人
    Lucene数据写入流程
    cubeIDE开发,I2C协议采集传感器数据(SHTC1、LTR-553ALS、BMP280、LSM6DSL、MMC3680KJ)
    【无标题】
    ClickHouse UDF 运行速度慢问题
  • 原文地址:https://blog.csdn.net/ailian_f/article/details/139836852