美文网首页js css htmljavascript深入JavaScript
深入JavaScript Day21 - 手写实现Promise

深入JavaScript Day21 - 手写实现Promise

作者: 望穿秋水小作坊 | 来源:发表于2022-01-24 16:00 被阅读0次

一、手写分步骤实现Promise(对于掌握回调函数的奥义也很有帮助)

1、实现executor的传递,并且为executor带上resolve、reject参数

class HYPromise {
  constructor(executor) {
    const resolve = () => {
      console.log("resolve被调用");
    };
    const reject = () => {
      console.log("reject被调用");
    };
    executor(resolve, reject);
  }
}

const myPromise = new HYPromise((resolve, reject) => {
  // 这里省略【执行一堆逻辑】
  resolve();
});

2、实现同一个promise对象,它的 resolve 和 reject 只能有一个被调用

const PROMISE_STATUS_PENDING = "pending";
const PROMISE_STATUS_RESOLVED = "resolved";
const PROMISE_STATUS_RJECTED = "rejected";

class HYPromise {
  constructor(executor) {
    const resolve = () => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.status = PROMISE_STATUS_RESOLVED;
        console.log("resolve被调用");
      }
    };
    const reject = () => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.status = PROMISE_STATUS_RJECTED;
        console.log("reject被调用");
      }
    };
    this.status = PROMISE_STATUS_PENDING;
    executor(resolve, reject);
  }
}

const myPromise = new HYPromise((resolve, reject) => {
  // 这里省略【执行一堆逻辑】
  reject();
  resolve();
});

3、加入then函数,并实现其逻辑。

const PROMISE_STATUS_PENDING = "pending";
const PROMISE_STATUS_RESOLVED = "resolved";
const PROMISE_STATUS_RJECTED = "rejected";

class HYPromise {
  constructor(executor) {
    const resolve = (value) => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.status = PROMISE_STATUS_RESOLVED;
        this.value = value;
        console.log("resolve被调用");
        queueMicrotask(() => {
          this.onResolved(this.value);
        });
      }
    };
    const reject = (reason) => {
      if (this.status === PROMISE_STATUS_PENDING) {
        this.status = PROMISE_STATUS_RJECTED;
        this.reason = reason;
        console.log("reject被调用");
        queueMicrotask(() => {
          this.onRejected(this.reason);
        });
      }
    };
    this.status = PROMISE_STATUS_PENDING;
    executor(resolve, reject);
  }

  then(onResolved, onRejected) {
    this.onResolved = onResolved;
    this.onRejected = onRejected;
  }
}

const myPromise = new HYPromise((resolve, reject) => {
  // 这里省略【执行一堆逻辑】
  resolve(222);
  reject(111);
});

myPromise.then(
  (res) => {
    console.log("then res", res);
  },
  (err) => {
    console.log("then err", err);
  }
);

相关文章

  • 深入JavaScript Day21 - 手写实现Promise

    一、手写分步骤实现Promise(对于掌握回调函数的奥义也很有帮助) 1、实现executor的传递,并且为exe...

  • 手写Promise

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

  • javaScript基础知识

    冴羽写博客 JavaScript深入系列ES6中promise如何实现 自我总结的JS javascript知识体...

  • 「JavaScript」手写promise的实现

    知其然必知起所以然 Promise是用来处理异步的一种方案,以前如果在有碰到回调地狱的情况,代码看起来就非常的糟糕...

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

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

  • [深入19] 手写Promise

    导航 [深入01] 执行上下文[https://juejin.im/post/684490404605093479...

  • 11大模块前端核心技术总结

    模块一:JavaScript篇 闭包,原型,数组方法,this指向,DOM,手写Promise,Cookie等 模...

  • 手写Promise实现

    初学ES 6的Promise之后, 感觉这个新的异步处理模型有点绕, 为了加深理解, 所以尝试手写Promise的...

  • JavaScript之手写Promise

    为更好的理解, 推荐阅读Promise/A+ 规范 实现一个简易版 Promise 在完成符合 Promise/A...

  • 手写promise

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

网友评论

    本文标题:深入JavaScript Day21 - 手写实现Promise

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