定时器setImmediate
定时器
说起 JavaScript
的定时器,相信大家一定很熟悉 setTimeout
和 setInterval
。
具体功能不再重述,定时器的作用主要是做延时任务。
并且,像我们熟悉知道的编程语言,Java
、PHP
,
都包含与生俱来的多线程能力,可以同时处理多个任务。
而 JavaScript
则设计成 单线程
结合 event-loop
的异步任务调度模式。
在这种特别的设计模式下,JavaScript
不得不依赖定时器,来应对不同场景的逻辑。
阻塞
也因为 JavaScript
是 单线程
的运行环境,
同时也带来了 代码运行阻塞
的副作用。
为了解决各种各样的时序场景,
就诞生了 setTimeout(fn, 0)
这一句代码。
在阅读代码时,我们会产生非常符合人类直觉的想法:
这里的 0
,代表浏览器在 0
毫秒后执行任务 fn
。
或者:浏览器会立即后执行任务 fn
。
当然,以上的想法是错误的。注意,是错误的。
正确的解读当然是:
任务 fn
会添加到 event-loop
的事件队列。
仅当,浏览器处理事件队列时, 0
毫秒,确保让这个任务 fn
会被执行。
setImmediate
而本文的主角 setImmediate
就是 setTimeout(fn, 0)
的替代函数。
先看一下 MDN 的文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setImmediate
新旧两种解决方案,目的都是,为了让浏览器处理 更重要的任务时 进行让道。
与 setTimeout(fn, 0)
不同的是,setImmediate
的处理优先级更高。
setImmediate
的设计更像 nodejs
中的 process.nextTick
。
参考
🔗https://www.zhihu.com/question/23028843
🔗http://www.lixinliang.com/2018/05/25/setimmediate/
以上是 定时器setImmediate 的全部内容, 来源链接: www.h5w3.com/115484.html