- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想做这样的事情:
var events = require("events");
var emitterA = new events.EventEmitter();
var emitterB = new events.EventEmitter();
emitterA.addListener("testA", function(){
console.log("emitterA detected testA");
});
emitterB.addListener("testA", function(){
console.log("emitterB detected testA");
});
emitterA.emit("testA");
输出是这样的:
emitterA detected testA
emitterB detected testA
但是当我运行这段代码时,我得到的输出是:
emitterA detected testA
我基本上希望一个发射器监听另一个发射器发出的事件。
理由:我在 Node 上写一个服务器,服务器发送服务器发送事件。这意味着我将需要持久连接。为了确保连接不会因为某种原因而关闭(我不想将超时设置为无穷大,因为这感觉像是一个 hack 并且看起来不安全),我发送了一个只有空白数据的心跳,只是这样正在传递给浏览器。
我正在运行一个计时器,每个时间段(在我的测试用例中为 1 秒),它将触发 server.emit("hb");
之后我写入并发送数据到同时请求所有对象(在我的笔记本电脑上,这只是多个选项卡和多个浏览器)。所以基本上 req.on("hb", callback)
这对我来说似乎更清晰,因为另一种方法是为每个请求对象提供自己的计时器,这意味着将有许多计时器在各处运行,每个计时器都会导致各自的请求对象发出心跳事件。这似乎不是一种最佳的做事方式。
另外,因为每个请求对象都是自发创建和销毁的,所以这样做基本上可以确保监听器也被创建和销毁。
所以我想要的是服务器发出的心跳事件,所有事件的请求对象都会听到它并沿着它们自己的连接写入数据。
另一种选择(我现在正在使用的方法)是让服务器监听它自己的事件,并让服务器写入心跳。问题在于服务器上的 maxListeners 限制——每个请求对象都会向服务器附加一个新的“hb”监听器,以便服务器可以监听该特定请求对象的事件。不过,最大听众数是 10,虽然我也可以将其设置为无穷大,但我不太热衷于这样做,因为我真的很好奇是否有更好的方法。
对我来说,最好和最干净的解决方案似乎真的是让请求对象“订阅”服务器事件。我这样做是为了学习如何在 node 中编程,所以我想尽可能少地实现外部库,并利用 node 的原始功能来实现,但如果它需要一个外部库,我会很乐意阅读它源代码,以便我可以学习如何实现小型本地实现。
最佳答案
请注意,EventEmitter 是 javascript 中的唯一来源。它们不是每个人都可以收听的系统范围的事件。它们是可以发出事件以支持异步模式的对象。为了完成你想要的,你需要多个东西听同一个发射器。像这样:
'use strict';
var events = require( 'events' );
//Create a new sole-source event emitter
var emitterA = new events.EventEmitter();
//create a container that can listen
function EventListener( name ) {
console.log( 'new event listener, name=' + name );
this.name = name;
this.ack = function() {
console.log( this.name + ' just heard testA' );
};
this.listenTo = function( event, emitter ) {
var self = this;
emitter.on( event, function() {
self.ack();
} );
};
}
var listenerA = new EventListener( 'A', emitterA );
listenerA.listenTo( 'testA', emitterA );
var listenerB = new EventListener( 'B', emitterA );
listenerB.listenTo( 'testA', emitterA );
setInterval( function() {
emitterA.emit( 'testA' );
}, 1000 );
输出:
$ node testfile.js
new event listener, name=A
new event listener, name=B
A just heard testA
B just heard testA
A just heard testA
B just heard testA
...
请注意,对于其他用例,您需要使用 WebSocket。 EventEmitter 不会按照您希望的方式工作,尤其是对于远程客户端。 (socket.io
的评论确实是一个很好的起点。)
关于javascript - 如何让 EventEmitter 监听 Node.js 中的另一个 EventEmitter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26465358/
我已经尝试了很长时间自己解决这个问题,但找不到适合我的问题的解决方案。 我有这个方法: handle_database = function(callback, req, res) { pool.ge
我差点把问题标题写成 - Communicating between eventEmitters 我有一个全局范围内的 node.js 模块 (X)(它使用 eventEmitter)。然后我有每个套
我正在尝试从一个 EventEmitter 发射到另一个 EventEmitter,或者寻找替代解决方案。下面的代码不起作用。 多发射器示例 var events = require('events'
有很多示例在自定义事件发射器构造函数中未使用 events.EventEmitter.call(this),而其他示例正在使用它 (official documentation): var event
假设我有这段代码: export class ProductsListComponent { @Output() onProductSelected: EventEmitter; constr
有时我们会遇到泛型变量应该被省略的情况。像这样: @Component( ... ) class MyComponent { @Output() public cancel = new Eve
我想做这样的事情: var events = require("events"); var emitterA = new events.EventEmitter(); var emitterB = n
EventEmitter.emit() 和 EventEmitter.next() 有什么区别?两者都将事件分派(dispatch)给订阅的监听器。 export class MyService {
我是 angular2 的新手,我对使用 EmitterService 的 EventEmitter 感到困惑,任何人都可以向我解释 Emitter 的用途。 在不使用@input 和@output
我正在学习 Node.js,对自定义 EventEmitter 有一些困惑。代码如下: var events = require("events"); function MyEmitter (name
如标题所述,我想用 TypeScript 重写下面的语句 EventEmitter = require('events').EventEmitter ES6风格 import {EventEmitte
obj.prototype.__proto__ = events.EventEmitter.prototype 我有时会看到上面的代码,我用谷歌搜索了一下,他们说这一行将所有 EventEmitter
我创建了一个抽象父类(super class)来处理我应用中各种表单组件的通用因素。 出于某种原因,我无法正确捕获由在父类(super class)中声明了 EventEmitter 的派生类发出的事
我尝试将表单从我的子组件传递给他的父组件。 child TS: @Output() submit: EventEmitter = new EventEmitter(); updateStream():
这真的很奇怪,也很难解释。 我用过EventEmitter在我的一些服务中,我一直在使用它来更改我的 View 数据。 我遇到了更改路线(通过链接或通过历史返回)的问题,它似乎被多次触发,因此它搞乱了
我正在开发一个 Angular2 组件,它使用网络摄像头将图片捕捉到 Canvas 元素,并将其提取为 Blob。 Blob 和事件分别正常工作,但是当我尝试从 toBlob 的回调函数内发出事件时,
当我有一个带有选择器'recursive-element'的模板时,它的模板看起来像这样 在我定义的类中 greetEvent = new EventEmitter
我非常喜欢将函数导出为 JavaScript 模块的主要 API 的模式。原因是在 JS 中,函数基本上可以做典型对象可以做的任何事情,然后再做一些。 所以这对我来说很典型: function stu
我有这个 Node js脚本: var EventEmitter = require('events').EventEmitter, util = require('util'); var p
在事件生成后附加事件处理程序有一个看似众所周知的问题。这主要是在调用遵循返回 EventEmitter 模式的函数时出现的问题,例如: var EventEmitter = require('even
我是一名优秀的程序员,十分优秀!