美文网首页
在浏览器实现nextTick的方法

在浏览器实现nextTick的方法

作者: strong9527 | 来源:发表于2018-03-02 16:39 被阅读16次

由于在github用javascript实现了一下promise的简单功能。但是其中nextTick的实现主要是借助immediate包

所以一直想找一个机会总结一下nextTick在浏览器中如何实现。

只要环境允许,优先使用顺序靠前的

1.MutationObserver

var Mutation = window.MutationObserver || window.WebKitMutationObserver;

exports.install = function (handle) {
  var called = 0;
  var observer = new Mutation(handle);
  var element = global.document.createTextNode('');
  observer.observe(element, {
    characterData: true
  });
  return function () {
    element.data = (called = ++called % 2);
  };
};


触发dom变动,借助MutationObserver回调函数,从而实现了nextTick

2.messageChannel

MDN: Channel Messaging API的Channel Messaging接口允许我们创建一个新的消息通道,并通过它的两个MessagePort 属性发送数据。


function (func) {
  var channel = new window.MessageChannel();
  channel.port1.onmessage = func;
  return function () {
    channel.port2.postMessage(0);
  };
};


3.stateChange

在dom文档中插入script文件,当script文件添加完成时,触发回调函数

function () {

    // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
    // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
    var scriptEl = global.document.createElement('script');
    scriptEl.onreadystatechange = function () {
      handle();

      scriptEl.onreadystatechange = null;
      scriptEl.parentNode.removeChild(scriptEl);
      scriptEl = null;
    };
    global.document.documentElement.appendChild(scriptEl);

    return handle;
  };


相关文章

网友评论

      本文标题:在浏览器实现nextTick的方法

      本文链接:https://www.haomeiwen.com/subject/gubaxftx.html