Promise

2023/5/15

# Promise/A+ 中文文档

# 1. promise解读

  1. 只有一个then方法,没有catch,race,all等方法,甚至没有构造函数

  2. Promise标准中仅指定了Promise对象的then方法的行为,其它一切我们常见的方法/函数都并没有指定,包括catch,race,all等常用方法,甚至也没有指定该如何构造出一个Promise对象,另外then也没有一般实现中(Q, $q等)所支持的第三个参数,一般称onProgress

  3. then方法返回一个新的Promise,而不是返回this

  4. 不同Promise的实现需要可以相互调用(interoperable)

  5. 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)
            })
        }
    })
}