通过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

posted @ 2020-04-14 09:49  代码男孩  阅读(872)  评论(0编辑  收藏  举报