手写Promise

作者: 果汁凉茶丶 | 来源:发表于2022-04-12 14:40 被阅读0次

$ 正常的promise用法

let p1 = new Promise((resolve, reject) => {
    let async_request = true
    if (async_request) {
        resolve({ data: 'p1 resolved' })
    } else {
        reject({msg: 'p1 rejected'})
    }
})

p1.then(res => {
    console.log(res.data)
})

$ 手写的Promise

// promise是个构造函数
function myPromise(excutor) {
    let self = this
    self.status = 'pending'
    self.value = null
    self.reason = null

    // 解决异步问题,发布订阅模式。暂存.then的回调函数
    self.onFulfilledCallbacks = []
    self.onRejectedCallbacks = []

    function resolve(value) {
        if (self.status === 'pending') {
            self.value = value
            self.status = 'fulfilled'
            // 执行.then里暂存的回调函数
            self.onFulfilledCallbacks.forEach(fn => fn(value))
        }
    }

    function reject(reason) {
        if (self.status === 'pending') {
            self.reason = reason
            self.status = 'rejected'

            self.onRejectedCallbacks.forEach(fn => fn(reason))
        }
    }

    // 立即执行
    excutor && excutor(resolve, reject)
}

myPromise.prototype.then = function(onFulfilled, onRejected) {
    let _this = this
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (data) => { resolve(data) }
    onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err }

    // 如果是链式调用,判断传入的参数是否是promise,如果是,继续执行.then,如果不是,返回结果
    if (self.status === 'fulfilled') {
        return new myPromise((resolve, reject) => {
            try {
                let x = onFulfilled(self.value) // 将上一个promise结果当作番薯传给传入的promise
                x instanceof myPromise ? x.then(resolve, reject) : resolve(x)
            } catch (error) {
                reject(error)
            }
        })
    }

    if (self.status === 'rejected') {
        return new myPromise((resolve, reject) => {
            try {
                let x = onRejected(self.reason)
                x instanceof myPromise ? x.then(resolve, reject) : reason
            } catch (error) {
                reject(error)
            }
        })
    }

    // 解决异步任务回调执行问题,添加订阅模式
    if (self.status === 'pending') {
        return new myPromise((resolve, reject) => {
            self.onFulfilledCallbacks.push(() => {
                let x = onFulfilled(self.value)
                x instanceof myPromise ? x.then(resolve, reject) : resolve(x)
            })
            self.onRejectedCallbacks.push(() => {
                let x = onRejected(self.reason)
                x instanceof myPromise ? x.then(resolve, reject) : resolve(x)
            })
        })
    }
}

# 测试可行性
let mp1 = new myPromise((resolve, reject) => {
    let ok = true
    if (ok) {
        setTimeout(() => {
            console.log('进入setTimeout')
            resolve({data: 'resolve data_setTimeout'})
        }, 1000)
    } else {
        reject({ message: 'myPromise error' })
    }
})

mp1.then(res => {
    console.log(res.data)
}, err => {
    console.log(err.message)
})

相关文章

  • 手写Promise

    手写 Promise 我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写...

  • 手写 Promise 系列 --- 3

    在前两篇(手写 Promise 系列 --- 1)和(手写 Promise 系列 ---2) 中,达成了3个目标 ...

  • 手写Promise

    $ 正常的promise用法   $ 手写的Promise   # 测试可行性

  • 手写promise

    手写promise 带大家手写一个 promis。在手写之前我会先简单介绍一下为什么要使用promise、prom...

  • 纯手写实现自己的nodejs promise 库

    纯手写实现自己的nodejs promise 库什么是Promise?promise 链Async/Await后续...

  • 手写基础 promise

    1. 前言 玩下吧 手写 promise,看看能写成啥样 2. promise 基础结构 3. 手写`promi...

  • 手写 Promise

    一、Promise 是一个异步操作返回的对象,用来传递异步操作的消息。 Promise 介绍和使用详见: 认识并使...

  • 手写Promise

  • 手写Promise

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 这篇博客有关于P...

  • 手写promise

    本章节纯粹是对promise手写实现。如果不了解promise自行了解再来学习本章知识。promise初体验首先,...

网友评论

    本文标题:手写Promise

    本文链接:https://www.haomeiwen.com/subject/sdxnsrtx.html