emitter.on 方法如何知道何时等待事件?
How does emitter.on method know when to wait for event?
当我运行这段代码时:-
const EventEmitter = require('events')
class Ping extends EventEmitter {
constructor() {
super()
}
}
const myEmitter = new Ping()
myEmitter.on('ping', (arg) => {
console.log("Trigger", arg)
})
我希望程序永远挂起,因为没有事件发射器,但它会立即停止。好像它'knows'永远不会触发事件。
当我 运行 这个代码时:-
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)
程序按预期运行。
请解释一下。还有什么资源可以了解所有这些方法或节点在幕后是如何工作的?
Nodejs 使用一个系统,其中进程内异步操作(包括计时器)全部注册到 nodejs 的一些内部。使用它,nodejs 知道是否有任何挂起或进程中的异步操作。尚未触发的计时器、正在侦听的服务器和打开的套接字都是进程内异步操作的示例。
当没有未决的异步或活动操作剩余时,nodejs 将自动退出。只要至少有一个挂起的异步操作,nodejs就不会退出。这个想法是,如果没有任何类型的未决操作,则无法通过任何方式创建未来事件,因此 nodejs 无事可做,也永远不会有任何事可做 - 应用程序必须完成。事件驱动系统中没有未来事件意味着该应用程序将来永远不会做任何事情 - 是时候退出了。
如果你想使用 .unref()
方法,你实际上可以告诉 nodejs 忽略特定的异步操作。这可以用于许多事情,例如计时器、套接字、服务器等...例如,您可以在计时器 here.
上看到 .unref()
方法
在您的第一个代码示例中,您创建了发射器,但没有活动的异步或实时操作,因此 nodejs 知道活动操作的计数为零,因此它可以退出。
在您的第二个代码示例中,您有一个活动计时器,这意味着活动操作的计数不为零,并且 nodejs 在计时器触发之前不会退出。
您可以 运行 做一个小实验:
let timer = setTimeout(() => {
myEmitter.emit('ping', "Hello!")
}, 2000);
// tell nodejs not to wait for this timer
timer.unref();
而且,您会发现甚至您的第二个代码块也会立即退出,因为 nodejs 不再将该计时器计为活动操作之一。
当我运行这段代码时:-
const EventEmitter = require('events')
class Ping extends EventEmitter {
constructor() {
super()
}
}
const myEmitter = new Ping()
myEmitter.on('ping', (arg) => {
console.log("Trigger", arg)
})
我希望程序永远挂起,因为没有事件发射器,但它会立即停止。好像它'knows'永远不会触发事件。
当我 运行 这个代码时:-
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)
程序按预期运行。 请解释一下。还有什么资源可以了解所有这些方法或节点在幕后是如何工作的?
Nodejs 使用一个系统,其中进程内异步操作(包括计时器)全部注册到 nodejs 的一些内部。使用它,nodejs 知道是否有任何挂起或进程中的异步操作。尚未触发的计时器、正在侦听的服务器和打开的套接字都是进程内异步操作的示例。
当没有未决的异步或活动操作剩余时,nodejs 将自动退出。只要至少有一个挂起的异步操作,nodejs就不会退出。这个想法是,如果没有任何类型的未决操作,则无法通过任何方式创建未来事件,因此 nodejs 无事可做,也永远不会有任何事可做 - 应用程序必须完成。事件驱动系统中没有未来事件意味着该应用程序将来永远不会做任何事情 - 是时候退出了。
如果你想使用 .unref()
方法,你实际上可以告诉 nodejs 忽略特定的异步操作。这可以用于许多事情,例如计时器、套接字、服务器等...例如,您可以在计时器 here.
.unref()
方法
在您的第一个代码示例中,您创建了发射器,但没有活动的异步或实时操作,因此 nodejs 知道活动操作的计数为零,因此它可以退出。
在您的第二个代码示例中,您有一个活动计时器,这意味着活动操作的计数不为零,并且 nodejs 在计时器触发之前不会退出。
您可以 运行 做一个小实验:
let timer = setTimeout(() => {
myEmitter.emit('ping', "Hello!")
}, 2000);
// tell nodejs not to wait for this timer
timer.unref();
而且,您会发现甚至您的第二个代码块也会立即退出,因为 nodejs 不再将该计时器计为活动操作之一。