Tac say

只想做个程序演奏家

Q关于nextTick的实现

Q 其中nextTick的一部分是用MessageChannel实现

1
2
3
4
5
6
7
8
9
10
11
12
13
   var channel = new MessageChannel();
  // linked list of tasks (single, with head node)
  var head = {}, tail = head;
  channel.port1.onmessage = function () {
      head = head.next;
      var task = head.task;
      delete head.task;
      task();
  };
  nextTick = function (task) {
      tail = tail.next = {task: task};
      channel.port2.postMessage(0);
  };

也有一种实现是用setTimeout(task, 0);

测试下两者的性能区别:http://jsperf.com/messagechannel-vs-settimeout. MessageChannel还是有明显的性能优势

一些额外的参考资料:

HTML5 web通信(跨文档通信/通道通信)简介 by zhangxinxu <有对message和MessageChannel的例子>

HTML5 Web Messaging <列举了传统messaging不支持的url pattern,说明了Web Messaging的必要性>

Comments