Tag: eventemitter

使用事件发射器触发事件​​持续顺序

关于事件发射器,我有一点儿不好意思的问题,但是对于可能的程序逻辑来说真的很重要。 我正在使用一些外部库引发我正在听的事件。 可以说,它触发了2个事件:' 数据 '和' 错误 '。 让我们说,lib将始终在错误之前调用数据 ,如下所示: emit('data', 'some data'); emit('error', 'some error'); 问题是 :在我的监听方法中,我能100%确定数据事件总是会出现在错误事件之前? lib.on('data', function(data) { // is this always first }); lib.on('error', function(error) { // or maybe this }); 谢谢, 伊万

Node.js EventEmitter事件不再在节点12.1+上触发

我已经将问题解决回到以下代码: var EventEmitter = require("events").EventEmitter, util = require('util'); function Foo() { EventEmitter.call(this); } util.inherits(Foo, EventEmitter); Foo.prototype.on('hello', function() { console.log("World"); }); Foo.prototype.start = function() { console.log('Hello'); this.emit('hello'); } var foo = new Foo(); foo.start(); 使用Node v0.10.36这个代码输出: 你好,世界 但是使用Node v0.12.1的代码输出: 你好 看起来监听器在Node的更高版本中不再起作用。 这是模块的一部分,是导出/需要的,所以我试图让听众远离模块的一个实例。 任何人都可以解释为什么这停止工作,以及build议如何做到这一点。

节点:将EventEmitter扩展到非原型对象

我总是看到这个: Parrot.prototype.__proto__ = EventEmitter.prototype; 有了这个,每一次你build造一个新的鹦鹉,它可以squawk。 但是,假设我构造了一个具有函数的对象,并且不打算创build多个实例: var parrot = { squawk: function(whatYouSaid){ this.emit("SQUAWK!!!!", whatYouSaid); } } 我将如何使这个扩展EventEmitter ? 我试过这个,但没有成功: _.extend(parrot, (new EventEmitter()));

在Node.js中,是否正在侦听EventEmitter,创build一个对它的引用?

如果我有这样的代码: const EventEmitter = require('events'); class Bot extends EventEmitter { sendMessage() { // do something this.emit('messageSent', 'user123'); } } class Controller { loadBot() { const bot = new Bot(); bot.on('messageSent', userId => { // do something }); } } 在loadBot创build的bot对象会立即被销毁吗? 或者稍后通过垃圾收集? 或者, Controller的实例是否持有对它的引用,以便在Controller实例被销毁之前, bot永远不会被销毁?

EventEmitter()的“静态方法”

我是Nodejs的新手,我对EventEmitter的listenerCount()方法有一个疑问,也是一般调用静态方法的方法。 这是来自事件发布器上的TutorialsPoint的Nodejs教程的示例代码: var events = require('events'); var eventEmitter = new events.EventEmitter(); // listener #1 var listner1 = function listner1() { console.log('listner1 executed.'); } // listener #2 var listner2 = function listner2() { console.log('listner2 executed.'); } // Bind the connection event with the listner1 function eventEmitter.addListener('connection', listner1); // Bind the connection event with the listner2 function […]

如何等待,直到多个EventEmitter实例在Node.js中发出相同的事件?

我正在研究一个Node.js模块/实用程序,这将允许我脚手架一些目录/文件。 长话短说,现在我有这样的主要function: util.scaffold("FileName") 这个“脚手架”方法返回一个EventEmitter实例,所以,当使用这个方法时,我可以做这样的事情: util.scaffold("Name") .on("done", paths => console.log(paths) 换句话说,当所有的文件被创build时,事件“完成”将被发射与脚手架文件的所有path。 一切都很好迄今。 现在,我正在试图用这个方法做一些testing和基准testing,我试图find一个方法来执行一些操作(断言,日志等),这个“脚手架”方法已被多次调用不同的“名称”的说法。 例如: const names = ["Name1", "Name2", "Name3"] const emitters = names.map(name => { return util.scaffold(name) }) 如果我正在返回Promise而不是EventEmitter,我知道我可以这样做: Promise.all(promises).then(()=> { //perform assertions, logs, etc }) 但是,我不知道如何使用EventEmitter来做同样的事情。 换句话说,我需要等到所有这些发射器发出这个相同的事件(即“完成”),然后再执行另一个操作。 任何想法/build议如何做到这一点? 提前致谢。

如何处理http.get响应中未被捕获的exception

我有这个代码使用API​​从第三方网站下载新闻提要。 它的设置每5秒运行一次,并且可能会发生任何新闻交易。 这个问题似乎是在没有发生新的事务时。 通过添加process.on('未捕获的exception',函数(error){console.log(“hmph”)})cron作业能够在5秒后继续,所以我被诱惑离开它。 然而,我添加了console.log(“hmph”)到现在我很困惑。 第一次,控制台会写hmph。 5秒钟后它会写hmph hmph 等等。 我知道我一定错过了一些东西,但我不太清楚它是什么。 我已经尝试在else语句中执行request.end(),但错误仍然激发。 没有process.on('uncaught …')抛出的错误是: events.js:71个参数[1]; //未处理的错误事件^错误:在TCP.onread(net.js:403:27)的Socket.socketOnData(http.js:1367:20) 用proccess.on('uncaught …')console.log(错误)是: {[Error:Parse Error] bytesParsed:161,code:'HPE_INVALID_CONSTANT'} 我如何正确处理这个错误? 缩写代码: var job = new cronJob('*/5 * * * * *', function(){ var request = http.get({ host: 'www.example.com', path: '/news_feed?apicode=myapicode', port: 80, headers: { 'accept-encoding': 'gzip' } }) request.on('response', function(response){ if (response.statusCode == 200){ […]

在Node.js中使对象实例可观察

背景 考虑以下: var EventEmitter = require('events').EventEmitter; var util = require('util'); function MyClass() { EventEmitter.call(this); } util.inherits(MyClass, EventEmitter); MyClass.prototype = { method1: function() { this.emit('method1'); } } module.exports = MyClass; 这里的目标是require这个模块,并创build所有“可观察”的实例,因为它们的事件可以将数据传递给处理这些事件的其他对象。 我使用这个模块是这样的: var MyClass = require('./my-module-index'); var instance = new MyClass(); instance.method1(); 这里有一个问题: 调用method1引发错误: TypeError: undefined is not a function 其堆栈跟踪指向emit呼叫。 题 这应该是一个单例类,以实现可观察的行为,还是有一些微妙的事情,让实例发出事件,可以在其他地方处理? 我通常会认为这是一个范围问题,但由于该方法在对象的原型上, this应该指任何实例(提供了new的)。

其他模块中的节点事件发射器

我有3个不同的JavaScript文件,最小的一个发出一个事件,同时第二个(较大的)文件拾取事件,并进一步发送到主文件。 这是我迄今为止所尝试的: //mini.js var EventEmitter = require('events').EventEmitter; var ee = new EventEmitter; console.log("Emitting event"); var message = "Hello world"; ee.emit('testing',message); //second.js var mini = require('./mini.js'); var EventEmitter = require('events').EventEmitter; var ee = new EventEmitter; mini.on('testing',function(message){ console.log("Second file received a message:",message); console.log("Passing further"); ee.emit('testing',message); }); //main.js var sec = require('./second.js'); sec.on('testing',function(message){ console.log("Main file received the message",message); […]

使用Socket IO在Node JS进程完成时发出消息

如何使用Socket IO和Express + Nodejs,以便在用户login时,我在MEAN栈应用程序的后台运行MongoDb更新查询。 我必须通知用户MongoDb进程已经以非阻塞的方式完成。 我不想使用callback,因为我必须将用户redirect到login页面,而无需等待此查询完成。 所以,如果这个MongoDb进程在用户login后的30秒之后完成,我想要刷新一条消息,说明已经完成了查询更新。 我已经设置套接字IO,但我不知道如何使用它,我的特殊情况。 Express +节点代码 io.on('connection', function(client) { console.log('Client connected…'); client.on('complete', function(data) { client.emit('messages', 'Hello from server'); }); }); 以下是我的AngularJs代码。 var socket = io.connect('/socketTest'); socket.on('connect', function(data) { socket.emit('complete', 'Mongo Process Done'); }); 这些是我从网站上复制的例子,我真的不明白需要做什么才能在客户端捕获这个事件。