本文转载自微信公众号「编程杂技」,对N答作者theanarkh。对N答转载本文请联系编程杂技公众号。对N答 一问一答是对N答以问答的形式聊一下 Node.js 的一个个知识点。 setTimeout(() => { },对N答 0) 和 setImmediate 谁先执行,这个是对N答 Node.js 里经常会被提到的一个问题,其实这两没什么关系,对N答setImmediate 是对N答 Node.js check 阶段的任务,setTimeout 是对N答 timer 阶段的任务,在 Node.js 事件循环中,对N答timer 阶段是对N答在 check 阶段执行的,看起来 setTimeout 的对N答回调肯定比 setImmediate 的回调先执行,但是对N答 Node.js 的实现中规定了 setTimeout 的超时时间最小是 1,这就导致了事件循环开始时,对N答定时器可能到期也可能不到期的对N答情况,所以谁先执行是网站模板不一定的。下面是示例代码。 在前端的时候,我们经常会轮询接口或定时去做一些事情,但是我们一般不使用 setInterval,因为浏览器中, setInterval 是用单独的线程实现的,当任务超市时,定时线程就会往 JS 线程追加一个回调任务。哪怕 JS 线程阻塞了,也不影响定时线程往 JS 线程里追加任务。如果 JS 线程在运行一段耗时的代码,定时线程就会往 JS 线程里追加很多回调任务,导致耗时代码执行完后,大量回调被执行,比如短期内大量的轮询接口请求,这并不是我们预期的效果。所以这种场景下一般使用 setTimeout 里调用 setTimeout 去模拟 setInterval。但在 Node.js 里就不会存在这个问题,首先 Node.js 定时器不是单独线程实现的云服务器提供商,然后当 setInterval 的回调被执行时,才会开始开始下一轮的计时。下面是 Node.js 中的实现,我们可以看到执行回调前会重新获取当前时间为下一轮开始时间,然后重新插入数据结构中。 在某些场景下,我们可能需要监听一个随机的端口,在 Node.js 里我们可以这样做 但是这种方式存在一个问题是在 cluster 模块下无法正常工作,比如我们希望在每一个进程里监听不同的随机端口,那么在子进程里执行 listen 的时候,不管是使用 cluster 的哪种模式都会导致多个进程监听同一个端口,解决方案就是使用 exclusive 标记。 exclusive 指示 Node.js 不共享监听端口,而是每次都监听一个新的端口,至于为啥要穿 port 等于 0,因为 Node.js 里的逻辑就是这样的香港云服务器。1 setTimeout 和 setImmediate
2 浏览器和 Node.js 的 setInterval 有什么区别
3 如何在 Node.js 里监听一个随机端口