zoukankan      html  css  js  c++  java
  • 通过MutationObserver实现Promise


    javascript分为宏任务和微任务,微任务屈指可数,无非是process.nextTick(node环境,process表示当前线程),Promise的回调函数,还有就是MutationObserver类监听节点时的回调,小生不才,无聊写了一个自己的实现:

    class myPromise {
      constructor (callback = function () {}) {
        const _resolve = (params) => {this.resolveParams = params; this.ifResolve = true;};
        const _reject = () => {this.ifReject = true};
        this.ifResolve = false;
        this.resolveParams = null;
        callback(_resolve, _reject);
      }
      static resolve (params) {
        this.ifResolve = true;
        this.resolveParams = params;
        return this;
      }
      then (callback = function () {}) {
        // 通过这个标识符,判断是否调用了resolve这个函数,如果调用了则执行下面的任务
        if (this.ifResolve) {
          let count = 0;
          // Vue2.5之前用的dom更新中使用了Promise,MutationObserver和setTimeout,我使用的是Vue关于MutationObserver的使用方式
          // MutationObserver可以绑定某个节点,当节点改变时,回调函数callback将放入微任务中
          // 通过装饰者模式,将回调函数包装一下,将执行之后的返回值保存起来
          const observe = new MutationObserver(() => {
            this.resolveParams = callback(this.resolveParams)
          });
          // 为了节约开销,创建一个文本比创建一个dom可划算的多
          const textNode = document.createTextNode(String(count));
          observe.observe(textNode, {
            // 当文本改变时触发回调
            characterData: true
          });
          // 改变文本,回调callback触发
          textNode.data = String(++count);
        }
        return this;
      }
    }
    console.log('start');
    new myPromise((resolve, reject) => {
      console.log('start promise');
      resolve();
    }).then(e => {
      console.log('then');
    });
    console.log('end promise');
    

    如果喜欢我的实现,可以连同下面的链接一同分享,谢谢
    https://www.cnblogs.com/smallZoro/p/12695978.html

  • 相关阅读:
    windows 环境下 MySQL 8.0.13 免安装版配置教程
    mysql锁分析
    Sublime Text 安装sftp插件
    SecureCRT rz 上传文件失败问题
    java与javac版本不一致问题
    比较几种工具Python(x,y) Anaconda WinPython
    王石:没变强是因为你太舒服!
    网络爬虫urllib2 tornado
    R包介绍
    互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....
  • 原文地址:https://www.cnblogs.com/smallZoro/p/12695978.html
Copyright © 2011-2022 走看看