etoileli

2019-09-09 17:50

聊一聊一个有趣的定时器 setImmediate

本文作者:IMWeb etoileli 原文出处:IMWeb社区 未经同意,禁止转载

定时器

说起 JavaScript 的定时器,相信大家一定很熟悉 setTimeoutsetInterval

具体功能不再重述,定时器的作用主要是做延时任务。

并且,像我们熟悉知道的编程语言,JavaPHP

都包含与生俱来的多线程能力,可以同时处理多个任务。

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/

1条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。