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

  • 相关阅读:
    xcode5 ios6程序图标去掉阴影
    ios程序启动时去掉状态栏
    ios启动图标程序适配
    c语言基础:各种数据类型的输出占位符
    c语言变量作用域问题
    JS 学习笔记--11---内置对象(Global/Math)
    JS 学习笔记--10---基本包装类型
    JS 学习笔记--9---变量-作用域-内存相关
    JS 学习笔记--8---Function类型
    JS 学习笔记--6---日期和时间
  • 原文地址:https://www.cnblogs.com/smallZoro/p/12695978.html
Copyright © 2011-2022 走看看