首页 > 其他分享 >模拟实现Promise

模拟实现Promise

时间:2023-05-15 22:48:13浏览次数:30  
标签:resolve const val 实现 state Promise reject return 模拟

 

Code:

var MiniPromise = (function MiniPromiseWrapper() {
  const PENDING = 'pending';
  const FULFILLED = 'fulfilled';
  const REJECTED = 'rejected';

  const _state = Symbol('state');
  const _result = Symbol('result');
  const _handler = Symbol('handler');
  const _changeState = Symbol('change_state_function');
  const _run = Symbol('run_function');
  const _handleThen = Symbol('handle_then');

  const microTaskQueue = (fn) => {
      if (typeof process === 'object' && typeof process.nextTick === 'function') {
          process.nextTick(fn);
      }
      else if (typeof MutationObserver === 'function') {
          const observer = new MutationObserver(fn);
          const textNode = document.createTextNode(' ');
          observer.observe(textNode, {
            characterData: true,
          });
          textNode.data = '';
      }
      else {
        setTimeout(fn, 0);
      }
  };

  const isPromiseLike = (val) => {
      if (val !== null && (typeof val === 'object' || typeof val === 'function')) {
          return typeof val.then === 'function';
      }
      return false;
  };

  class _MiniPromise {
      /**
       * 
       * @param {Function} executor 
       */
      constructor(executor) {
          this[_state] = PENDING;
          this[_result] = null;
          this[_handler] = []
          
          /**
           * 
           * @param {*} value 
           */
          const resolve = value => {
              this[_changeState](FULFILLED, value);
          };
          /**
           * 
           * @param {*} reason 
           */
          const reject = reason => {
              this[_changeState](REJECTED, reason);
          };

          // 如果在执行 executor 函数时报错(不能处理异步错误),则更改promise的状态(结果为err)
          try {
              executor(resolve, reject);
          }
          catch(err) {
              reject(err);
          }
      }

      [_changeState](state, result) {
          // 状态一旦改变,则不可逆
          if (this[_state] !== PENDING) {
              return;
          }
          this[_state] = state;
          this[_result] = result;
          this[_run]();
      }

      then(onFulfilled, onRejected) {
          return new _MiniPromise((resolve, reject) => {
              this[_handler].push({
                  onFulfilled,
                  onRejected,
                  resolve,
                  reject,
              });
              this[_run]();
          });
      }

      catch(onRejected) {
          return this.then(undefined, onRejected);
      }

      finally(onFinally) {
        const onResolve = (res) => {
          onFinally(res);
          return res;
        }
        const onReject = (err) => {
          onFinally(err);
          return err;
        };
        return this.then(onResolve, onReject);
      }

      [_handleThen](callback, resolve, reject) {
          microTaskQueue(() => {
              if (typeof callback !== 'function') {
                  const settled = this[_state] === FULFILLED ? resolve : reject;
                  settled(this[_result]);
                  return;
              }
              try {
                  const res = callback(this[_result]);
                  resolve(res);
              }
              catch(err) {
                  reject(err);
              }
          });
      }

      [_run]() {
          if (this[_state] === PENDING) {
              return;
          }
          while (this[_handler].length > 0) {
              const headItem = this[_handler].shift();
              const {
                  onFulfilled,
                  onRejected,
                  resolve,
                  reject,
              } = headItem;
              if (this[_state] === FULFILLED) {
                  this[_handleThen](onFulfilled, resolve, reject);
              }
              else if (this[_state] === REJECTED) {
                  this[_handleThen](onRejected, resolve, reject);
              }
          }
      }

      static resolve(val) {
          if (val instanceof Promise) {
              return val;
          }
          let _resolve;
          let _reject;
          const p = new MiniPromise((resolve, reject) => {
              _resolve = resolve;
              _reject = reject;
          });
          if (isPromiseLike(val)) {
              val.then(_resolve, _reject);
          }
          else {
              _resolve(val);
          }
          return p;
      }

      static reject(reason) {
          return new MiniPromise((_, reject) => {
              reject(reason);
          });
      }
  }

  return _MiniPromise;
})();

 

标签:resolve,const,val,实现,state,Promise,reject,return,模拟
From: https://www.cnblogs.com/fanqshun/p/17383413.html

相关文章

  • 实验四 电子琴模拟实验
    实验四电子琴模拟实验实验目的1、了解单片机系统发声原理2、进一步熟悉定时器编程方法实验说明1、利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。2、定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反......
  • 【设计模式】使用 go 语言实现简单工厂模式
    最近在看《大话设计模式》,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下。第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果。这个需求不难,难就难在类要怎么设计,才能达到可复用、维护性强、可拓展和灵活性高。运算符可能是加、减、乘、除,未了方......
  • CSS伪类实现0.5px边框
    div-class为需要添加0.5px边框的元素的类名,下面是less写法,css写法把嵌套的&::after提出来,换成.div-class::after.div-class{position:relative;&::after{position:absolute;bottom:0;content:'';width:100%;height:1px;background-c......
  • SICP:元循环求值器(Python实现)
    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看。这里顺便强烈推荐UCBerkeley的同名课程CS61A。在这个层次结构的最底层是对象语言。对象语言只涉及特定的域,而不涉及对象语言本身(比如它们的文法规则,或其中的其体句子)。如要涉及它们,则要有一种元......
  • 【深入浅出 Yarn 架构与实现】6-4 Container 生命周期源码分析
    本文将深入探讨AM向RM申请并获得Container资源后,在NM节点上如何启动和清理Container。将详细分析整个过程的源码实现。一、Container生命周期介绍Container的启动由ApplicationMaster通过调用RPC函数ContainerManagementProtocol#startContainers()发起请求,NM......
  • 5、Nginx 常见模块 auth_basic:实现账户认证功能
    Nginx账户认证功能由ngx_http_auth_basic_module模块提供此功能官方帮助:http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html语法格式:Syntax: auth_basic_user_filefile;Default: —Context: http,server,location,limit_except范例:authbasic提......
  • 专访高雪峰:从GPT3.5到4,超强推理能力的实现与“图”密不可分
    “符号”与“向量”,AGI的两条腿。作者|王与桐整理|Ricky2023年3月15日,GPT4亮相。尽管以GPT3.5为基础的ChatGPT更具里程碑意义,毕竟引发了全球C端用户的使用,但是在更多AI从业者看来,GPT4的意义远高于3.5,这是因为,GPT4具备了令人惊艳的“逻辑推理”能力。但为什么能够实现“推......
  • 使用C++实现贝塞尔曲线算法平滑多边形
    定义一个函数来计算贝塞尔曲线的坐标,并使用循环来更新坐标。把坐标连接起来,就可以得到一个平滑的多边形。例如:可以使用贝塞尔曲线或B样条曲线来实现曲线平滑。这两种曲线都是由一组控制点构成的,并且可以通过调整控制点来调整曲线形状。贝塞尔曲线是一种由多个点组成的曲线,其中每......
  • 打卡 c语言趣味编程 二分查找算法实现
    N个有序整数数列已放在一维数组中,利用二分查找法查找整数在数组中的位置。若找到,则输出其下标值;反之,则输出“Notbefound!”。思路:二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,这些子问题互相独......
  • 使用神经网络实现鸢尾花的预测
    主要目的:从给出的csv文件中加载数据,并划分为训练集和验证集,划分比例为:训练集/验证集=7/3。注意需要做数据的标准化,可使用pandas读取数据,再将dataframe转成numpy数组(to_numpy()),然后打乱数据、再切片、值标准化。构建一个神经网络模型,并使用划分好的训练集数据训练模型,使用划分......