Promise 原理总结

手写一个符合 promise/A+规范的 Promise

  1. 首先我们知道实现异步的方法 有 Promise,async、await ,回调,generator+co 库,这次我们主要讲的是 Promise

根据 promise/A+规范 我们可以了解到

  • 解决(fulfill):指一个 promise 成功时进行的一系列操作,如状态的改变、回调的执行。虽然规范中用 fulfill 来表示解决,但在后世的 promise 实现多以 resolve 来指代之。
  • 拒绝(reject):指一个 promise 失败时进行的一系列操作。
  • 终值(eventual value):所谓终值,指的是 promise 被解决时传递给解决回调的值,由于 promise 有一次性的特征,因此当这个值被传递时,标志着 promise 等待态的结束,故称之终值,有时也直接简称为值(value)。
  • 据因(reason):也就是拒绝原因,指在 promise 被拒绝时传递给拒绝回调的值。
通过上述文章可以基本了解一下 Promise 的基本内容
  1. 创建一个用 es5 或 es6 创建 Promise 类 这里 es6 的方式来创建 我们先来创建一个简单的 Promise 类
const {
   
    isFun } = require("./util.js");

class MyPromise {
   
   
   // 三种状态  等待, 解决 , 拒绝
  static PENDING = "pending";
  static FULFILLED = "fulfilled";
  static REJECTED = "rejected";
  constructor(callback) {
   
   
    // 校验是否是一个函数
    if (!isFun(callback)) {
   
   
      throw new Error(`${
     
     callback}不是一个函数`);
    }
    //改变this 为甚么要改变this 指向呢? 谁调用的 this在bro 中是window 在node中是undefined
    this.initBind();
    // 初始化状态值
    this.initVal();
    // 当 callback内部
    callback(this.resolve, this.reject);
  }
  // 初始化绑定
  initBind() {
   
   
    this.resolve = this.resolve.bind(this);
    this.reject = this.reject.bind(this);
  }
  // 初始化值
  initVal() {
   
   
    this.value = null; // 解决最终回调
    this.err = null; // 拒接最终回调
    this.status = MyPromise.PENDING; // 执行状态
  }
  // 解决
  resolve(val) {
   
   
    this.status = MyPromise.FULFILLED;
    this.value = val;
  }
  // 拒因
  reject(err) {
   
   
    this.status = MyPromise.REJECTED;
    this.err = err;
  }
}
// 三种状态  等待, 解决 , 拒绝
exports.Promise = MyPromise;

  1. then 方法的实现
    一个 promise 必须提供一个 then 用来返回解决,拒因
    promise 的 then 方法接受两个参数:
onFulfilled ,onRejected
class MyPromise {
   
   
  ...
  // then 方法
  then(onFulfilled, onRejected) {
   
   

    // onFulfilled是否是函数
    if (!isFun(onFulfilled)) {
   
   
      onFulfilled = function(val){
   
   }
    }
    // onRejected是否是函数
    if (!isFun(onRejected)) {
   
   
      onRejected = function(err){
   
   }
    }

    if (this.status === MyPromise.FULFILLED) {
   
   
        onFulfilled(this.value);
    }
    if (this.status === MyPromise.REJECTED) {
   
   
        onRejected(this.err);
    }
  }
}

  1. 接下来,我们来对比一下 原生 Promise,和自身定义的 MyPromise 执行顺序
console.log(1);
new MyPromise((resolve, reject) => {
   
   
  console.log(2);
  resolve("resolve");
}).then(
  (res) => {
   
   
    console.log(3)
Promise是一种用于处理异步操作的JavaScript对象。它的原理是基于事件循环和回调函数的机制。当我们创建一个Promise实例时,它会立即执行一个传入的函数,并返回一个Promise对象。这个函数又被称为executor函数,它接受两个参数resolve和reject。resolve函数用于将Promise的状态从pending变为fulfilled,并传递一个值作为结果;reject函数用于将Promise的状态从pending变为rejected,并传递一个原因作为错误信息。 在executor函数中,我们可以通过调用resolve和reject来改变Promise的状态。当某个异步操作成功完成时,我们可以调用resolve来将Promise状态变为fulfilled,并传递异步操作的结果。而当某个异步操作失败时,我们可以调用reject来将Promise状态变为rejected,并传递一个错误原因。 Promise的优点之一是可以链式调用。通过在Promise对象上调用then方法,我们可以注册回调函数来处理Promise的结果。当Promise的状态从pending变为fulfilled时,将会执行与then方法关联的回调函数,并将Promise的结果作为参数传递给回调函数。当Promise的状态从pending变为rejected时,将会执行与catch方法关联的回调函数,并将错误原因作为参数传递给回调函数。通过链式调用then方法,我们可以将多个异步操作串联起来,形成一个异步操作的流水线。 总结起来,Promise原理是通过executor函数、resolve函数和reject函数来实现异步操作的封装和处理。通过链式调用then方法,可以对Promise的结果进行处理和传递。而Promise的状态变化是基于事件循环和回调函数的机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [这一次,彻底弄懂 Promise 原理](https://blog.csdn.net/weixin_30881367/article/details/101419505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值