当我运行这个代码时:-
const EventEmitter = require('events')
class Ping extends EventEmitter {
constructor() {
super()
}
}
const myEmitter = new Ping()
myEmitter.on('ping', (arg) => {
console.log("Trigger", arg)
})我预计程序将永远挂起,因为没有事件发射器,但它立即停止。好像它知道这件事永远不会被触发似的。
当我运行这个代码时:-
const EventEmitter = require('events')
class Ping extends EventEmitter {
constructor() {
super()
}
}
const myEmitter = new Ping()
myEmitter.on('ping', (arg) => {
console.log("Trigger", arg)
})
setTimeout(() => {
myEmitter.emit('ping', "Hello!")
}, 2000)程序如预期的那样工作。请解释一下。此外,是否有任何资源可以知道所有这些方法或节点是如何在幕后工作的?
发布于 2021-11-26 21:41:15
nodejs使用一个系统,其中进程内异步操作(其中包括计时器)都向Nodejs的内部注册。使用此方法,nodejs知道是否存在任何挂起或进程内异步操作.尚未触发的计时器、侦听服务器和打开的套接字都是进程内异步操作的示例。
当没有挂起的异步或活动操作时,nodejs将自动退出。只要至少有一个挂起的异步操作,nodejs就不会退出。这样做的想法是,如果没有任何类型的未决操作,那么未来的事件就无法以任何方式创建,因此nodejs没有其他事情可做,也永远不会有任何事情可做--应用程序必须完成。在事件驱动的系统中,没有未来的事件,这意味着应用程序将永远不会做任何事情,在未来的时间退出。
如果需要使用.unref()方法,实际上可以告诉nodejs忽略特定的异步操作。这可以用于许多事情,如计时器,套接字,服务器等.例如,您可以在计时器.unref()上看到这里方法。
在第一个代码示例中,您创建发射器,但是没有活动的异步或活动操作,因此nodejs知道活动操作的计数为零,因此它可以退出。
在第二个代码示例中,您有一个timer active,这意味着活动操作的计数为非零,并且nodejs在计时器触发之前不会退出。
您可以通过这样做来进行一个小实验:
let timer = setTimeout(() => {
myEmitter.emit('ping', "Hello!")
}, 2000);
// tell nodejs not to wait for this timer
timer.unref();而且,您会发现即使是第二个代码块也会立即退出,因为nodejs不再将该定时器视为活动操作之一。
https://stackoverflow.com/questions/70130126
复制相似问题