首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >emitter.on方法如何知道何时等待事件?

emitter.on方法如何知道何时等待事件?
EN

Stack Overflow用户
提问于 2021-11-26 21:17:40
回答 1查看 458关注 0票数 0

当我运行这个代码时:-

代码语言:javascript
复制
const EventEmitter = require('events')


class Ping extends EventEmitter {
    constructor() {
        super()
    }
}

const myEmitter = new Ping()

myEmitter.on('ping', (arg) => {
    console.log("Trigger", arg)
})

我预计程序将永远挂起,因为没有事件发射器,但它立即停止。好像它知道这件事永远不会被触发似的。

当我运行这个代码时:-

代码语言:javascript
复制
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)

程序如预期的那样工作。请解释一下。此外,是否有任何资源可以知道所有这些方法或节点是如何在幕后工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 21:41:15

nodejs使用一个系统,其中进程内异步操作(其中包括计时器)都向Nodejs的内部注册。使用此方法,nodejs知道是否存在任何挂起或进程内异步操作.尚未触发的计时器、侦听服务器和打开的套接字都是进程内异步操作的示例。

当没有挂起的异步或活动操作时,nodejs将自动退出。只要至少有一个挂起的异步操作,nodejs就不会退出。这样做的想法是,如果没有任何类型的未决操作,那么未来的事件就无法以任何方式创建,因此nodejs没有其他事情可做,也永远不会有任何事情可做--应用程序必须完成。在事件驱动的系统中,没有未来的事件,这意味着应用程序将永远不会做任何事情,在未来的时间退出。

如果需要使用.unref()方法,实际上可以告诉nodejs忽略特定的异步操作。这可以用于许多事情,如计时器,套接字,服务器等.例如,您可以在计时器.unref()上看到这里方法。

在第一个代码示例中,您创建发射器,但是没有活动的异步或活动操作,因此nodejs知道活动操作的计数为零,因此它可以退出。

在第二个代码示例中,您有一个timer active,这意味着活动操作的计数为非零,并且nodejs在计时器触发之前不会退出。

您可以通过这样做来进行一个小实验:

代码语言:javascript
复制
let timer = setTimeout(() => {
    myEmitter.emit('ping', "Hello!")
}, 2000);

// tell nodejs not to wait for this timer
timer.unref();

而且,您会发现即使是第二个代码块也会立即退出,因为nodejs不再将该定时器视为活动操作之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70130126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档