美文网首页
十分钟手写 Promise

十分钟手写 Promise

作者: 前端好有趣 | 来源:发表于2021-07-01 16:42 被阅读0次

实现代码

// 定义 promise 的三个状态
const PENDING = "pending";
const RESOLVED = "resolved";
const REJECTED = "rejected";

// 创建 Promise 构造函数
function MyPromise(asyncFn) {
  const _this = this;
  // 定义几个内部变量
  _this.state = PENDING;
  _this.value = null;
  _this.resolvedCallbacks = [];
  _this.rejectedCallbacks = [];

  // 定义 resolve 方法
  function resolve(sucValue) {
    if (_this.state === PENDING) {
      _this.state = RESOLVED;
      // 现在获取到成功结果了
      _this.value = sucValue;
      // 然后开始执行获取到成功结果后的 callback 方法
      _this.resolvedCallbacks.map(onResolved => onResolved(_this.value));
    }
  }

  // 定义 reject 方法
  function reject(failValue) {
    if (_this.state === PENDING) {
      _this.state = REJECTED;
      // 现在获取到失败结果了
      _this.value = failValue;
      // 然后开始执行获取到失败结果后的 callback 方法
      _this.rejectedCallbacks.map(onRejected => onRejected(_this.value));
    }
  }

  // 执行 asyncFn 异步方法
  try {
    asyncFn(resolve, reject);
  } catch (e) {
    reject(e);
  }
}

// 定义实例方法 then()
MyPromise.prototype.then = function (onResolved, onRejected) {
  const _this = this;
  const _state = _this.state
  onResolved = typeof onResolved === "function" ? onResolved : (sucValue) => sucValue;
  onRejected = typeof onRejected === "function" ? onRejected : (failValue) => {
    throw failValue;
  };
  switch (_state) {
    case PENDING:
      // 实例处于 PENDING 状态,结果还未确定,将 callback 方法放入队列中,等待 resolve 触发后执行
      _this.resolvedCallbacks.push(onResolved);
      // 实例处于 PENDING 状态,结果还未确定,将 callback 方法放入队列中,等待 reject 触发后执行
      _this.rejectedCallbacks.push(onRejected);
      break;

    case RESOLVED:
      // 实例处于 RESOLVED 状态,结果已确定,直接执行 callback 方法
      onResolved(_this.value);
      break;

    case REJECTED:
      // 实例处于 REJECTED 状态,结果已确定,直接执行 callback 方法
      onRejected(_this.value);
      break;

    default:
      // 状态有误
      break;
  }
};

使用方式

function testPromise(flag) {
  return new MyPromise((resolve, reject) => {
    setTimeout(() => {
      if (flag) {
        resolve("success!");
      } else {
        reject("error!");
      }
    }, 3000);
  });
};

let p = testPromise(true)

p.then(res => {
  console.log(res)
})

相关文章

  • 手写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

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

网友评论

      本文标题:十分钟手写 Promise

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