huoxiangdong / Blog

学习记录
0 stars 0 forks source link

事件循环 #40

Open huoxiangdong opened 6 years ago

huoxiangdong commented 6 years ago

事件队列

v2-c3f5952213111548535cf1db3233137a_hd

另外,请注意下Promise的polyfill与官方版本的区别: 官方版本中,是标准的microtask形式 polyfill,一般都是通过setTimeout模拟的,所以是macrotask形式 请特别注意这两点区别 注意,有一些浏览器执行结果不一样(因为它们可能把microtask当成macrotask来执行了), 但是为了简单,这里不描述一些不标准的浏览器下的场景(但记住,有些浏览器可能并不标准)

huoxiangdong commented 6 years ago
huoxiangdong commented 6 years ago

异步执行线程

huoxiangdong commented 6 years ago

异步执行

huoxiangdong commented 6 years ago

v2-7eac6a23fac673d285a8f123ef87cf66_hd

huoxiangdong commented 6 years ago

v2-7911122f8f68039d31f3aa45bec8ed78_hd

huoxiangdong commented 6 years ago

定时器

huoxiangdong commented 6 years ago

使用MutationObserver实现microtask

observer.observe(textNode, { characterData: true }) timerFunc = () => { counter = (counter + 1) % 2 textNode.data = String(counter) }


不过,现在的Vue(2.5+)的nextTick实现移除了MutationObserver的方式(据说是兼容性原因),
取而代之的是使用MessageChannel
(当然,默认情况仍然是Promise,不支持才兼容的)。

MessageChannel属于宏任务,优先级是:setImmediate->MessageChannel->setTimeout,
所以Vue(2.5+)内部的nextTick与2.4及之前的实现是不一样的,需要注意下。