最全手写Promise纪录

155 阅读1分钟

一、promise基础部分实现

// 核心:3个状态2个方法1执行器// 扩展:2个异步回调容器const PENDING = 'PENDING'const RESOLVED = 'RESOLVED'const REJECTED = 'REJECTED'class Promise { // 规范 promise 可以是函数或对象    constructor(executor) {        // part1        this.status = 'PENDING'        this.value = undefined // 规范 值类型:undefined thenable promise        this.reason = undefined        // part2        this.onResolvedCallbacks = []        this.onRejectedCallbacks = []        let resolve = (value) => {            if (this.status === PENDING) {                this.value = value                this.status = RESOLVED                // part2                // 异步执行完成后(例如settimeout) 发布执行                this.onResolvedCallbacks.forEach(fn => fn())            }        }        let reject = (reason) => {            if (this.status === PENDING) {                this.reason = reason                this.status = REJECTED                // part2                // 异步执行完成后(例如settimeout) 发布执行                this.onRejectedCallbacks.forEach(fn => fn())            }        }        try {            executor(resolve, reject)        } catch (error) {            reject(error)        }    }    // 每个promise 上都有then方法并可以then多个 按顺序执行    //  能读到实例上成功值 value 和 失败值 reason    //  能执行成功方法 onfulfilled 和 失败方法 onrejected    then(onfulfilled, onrejected) { // then目前有2个参数        // part1 解决同步        if (this.status === RESOLVED) {            onfulfilled(this.value)        }        if (this.status === REJECTED) {            onrejected(this.reason)        }        // part2 解决异步        // 多个then的时候处理        if (this.status === PENDING) {            // 如果是异步就先订阅好            this.onResolvedCallbacks.push(() => {                // todo...                onfulfilled(this.value)            }) // 重写push方法的时候加入自己逻辑todo            this.onRejectedCallbacks.push(() => {                // todo...                onrejected(this.reason)            }) // 重写push方法的时候加入自己逻辑todo        }    }    catch() {    }}module.exports = Promise

// 测试用例
let Promise = require('./Promise')let promise = new Promise((res, rej) => {    //场景1 错误执行    // throw new Error('失败')    //场景2 异步执行 执行器    setTimeout(() => {        res('成功的数据')    }, 1000)    // setTimeout(() => {    //     rej('失败的数据')    // }, 1000)})promise.then(data => { // 成功    console.log('data', data)}, err => { // 失败    console.log('err', err)})promise.then(data => { // 成功    console.log('data1', data)}, err => { // 失败    console.log('err', err)})promise.then(data => { // 成功    console.log('data2', data)}, err => { // 失败    console.log('err', err)})