美文网首页
手写promise

手写promise

作者: 小猪佩奇的王子 | 来源:发表于2019-11-30 10:48 被阅读0次

class newPromise {
    constructor(fn) {
        this.state = "pending"
        this.value = null
        this.resolveCallbacks = []
        this.rejectCallbacks = []

        this.resolve = res => {
            if (this.state === "pending") {
                setTimeout(() => {
                    this.state = "resolved"
                    this.value = res
                    this.resolveCallbacks.map(cb => cb(this.value))
                }, 0)
            }
        }
        this.reject = err => {
            if (this.state === "pending") {
                setTimeout(() => {
                    this.state = "rejected"
                    this.value = err
                    this.rejectCallbacks.map(cb => cb(this.value))
                }, 0)
            }
        }

        try {
            fn(this.resolve, this.reject)
        } catch (err) {
            this.reject(err)
        }
    }

    then(onResolve, onReject) {
        console.log("调用then")
        var promise2 = new newPromise((res, rej) => {
            if (this.state === "pending") {
                this.resolveCallbacks.push(val => {
                    try {
                        let data = onResolve(val)
                        res(data)
                    } catch (e) {
                        rej(e)
                    }
                })
                this.rejectCallbacks.push(val => {
                    try {
                        let data = onReject(val)
                        res(data)
                    } catch (e) {
                        rej(e)
                    }
                })
            }

            if (this.state === "resolved") {
                try {
                    let data = onResolve(val)
                    res(data)
                } catch (e) {
                    rej(e)
                }
            }

            if (this.state === "rejected") {
                try {
                    let data = onReject(val)
                    res(data)
                } catch (e) {
                    rej(e)
                }
            }
        })
        return promise2
    }

    resolvePromise(promise2, x, resolve, reject) {}
}

newPromise.resolve = function(x) {
    return new newPromise((res, rej) => {
        return res(x)
    })
}

newPromise.reject = function(x) {
    return new newPromise((res, rej) => {
        return rej(x)
    })
}

newPromise.all = function(arr) {
    return new newPromise((res, rej) => {
        var result = []
        var step = 0
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(val => {
                result[i] = val
                step++
                if (step === arr.length) {
                    res(result)
                }
            }, rej)
        }
    })
}

newPromise.race = function(arr){
    return new newPromise((res, rej) => {
        for(let i = 0; i < arr.length; i++){
            arr[i].then(val => {
                res(val)
            }, rej)
        }
    })
}

finally

Promise.prototype.finally = function (callback) {
  let P = this.constructor;
  return this.then(
    value  => P.resolve(callback()).then(() => value),
    reason => P.resolve(callback()).then(() => { throw reason })
  );
};

相关文章

  • 手写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/wlfowctx.html