美文网首页
手写Promise

手写Promise

作者: 逆风飘游的鱼 | 来源:发表于2019-08-29 10:42 被阅读0次

https://juejin.im/post/5b2f02cd5188252b937548ab  详解

https://juejin.im/post/5cd8d76d5188256805093a9f

//Promise函数

function Promise(executor) {

    let self = this; //保留this。防止后面方法出现this只想不明的问题

    self.status = 'pending'; //promise的默认状态是pending

    self.value= undefined; //保存成功回调传递的值

    self.error = undefined; //保存失败回调传递的值

    self.onSuccessCallbacks = []; //存放成功的回调

    self.onErrorCallbacks = []; //存放失败的回调

    function resolve(value) {

        if (self.status === 'pending') {

            self.status = 'resolved'; //成功函数将其状态修改为resolved

            self.value= value; //将成功的值保存起来

            self.onSuccessCallbacks.forEach(fn=> {

                fn();

            });

        }

    }

    function reject(error) {

        if (self.status === 'pending') {

            self.status = 'rejected'; //失败函数将其函数修改为rejected

            self.error = error; //将失败的值保存起来

            self.onErrorCallbacks.forEach(fn=> {

                fn();

            })

        }

    }

    try {

        executor(resolve, reject);

    } catch (err) {

        reject(err);

    }

}

//then函数

Promise.prototype.then = function (onResolved, onRejected) {

    let self = this;

    let promiseAgain = new Promise((resolve, reject) => {

        if (self.status === 'pending') {

            self.onSuccessCallbacks.push(() => {

                    let x = onResolved(self.value); //将resolve函数保留的成功值传递作为参数

                    resolvePromise(promiseAgain, x, resolve, reject);

            })

            self.onErrorCallbacks.push(() => {

                    let x = onRejected(self.error); //将reject函数保留的失败值传递作为参数

                    resolvePromise(promiseAgain, x, resolve, reject);

            })

        }

        if (self.status === 'resolved') {

                let x = onResolved(self.value); //将resolve函数保留的成功值传递作为参数

                resolvePromise(promiseAgain, x, resolve, reject);

        }

        if (self.status === 'rejected') {

                let x = onRejected(self.error); //将reject函数保留的失败值传递作为参数

                resolvePromise(promiseAgain, x, resolve, reject);

        }

    })

    return promiseAgain;

}

//resolvePromise函数

function resolvePromise(promiseAgain, x, resolve, reject) {

    if (promiseAgain === x) {

        return reject(new TypeError("循环调用"));

    }

    if (x !== null && (typeof x === 'object' || typeof x === 'function')) {

        try {

            let then = x.then;

            if (typeof then === 'function') {

                then.call(x, (y) => {

                    resolvePromise(promiseAgain, y, resolve, reject);

                }, (e) => {

                    reject(e);

                })

            } else {

                resolve(x);

            }

        } catch (error) {

            reject(error);

        }

    } else {

        resolve(x);

    }

}

module.exports = Promise;

相关文章

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