H5W3
当前位置:H5W3 > JavaScript > 正文

定时器setImmediate

定时器

说起 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/

本文地址:H5W3 » 定时器setImmediate

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址