Tag: 事件

构造函数中的事件处理程序与构造函数之外的事件处理程序的行为不同

我有一个扩展EventEmitter的对象的两个实例,并监听一个名为finish的事件。 如果我在构造函数外部设置事件处理程序,一切都按预期工作。 每个实例都会听到它触发的finish的发生。 但是,如果我在构造函数中设置了事件处理程序,那么只有第二个创build的实例才会听到该事件,并对事件做出反应。 这里是代码: var util = require('util'); var EventEmitter = require('events').EventEmitter; var fs = require('fs'); var NEXT_ID = 0; var MyEmitter = function() { EventEmitter.call(this); this.id = NEXT_ID; NEXT_ID++; console.log('CREATED EMITTER WITH ID:', this.id) self = this; this.on('finish', function() { console.log('FINISH EVENT . CONSTRUCTOR LISTENER .', 'LISTENER ID:', self.id, '. ORIGINATOR ID:', this.id); […]

将Node.js作为客户端连接到Common Lisp服务器

我已经在node.js的alpha阶段有了一个小型的但CPU很重的应用程序,这是一个小游戏。 我遇到了性能问题,我需要加速至less20倍才能达到testing版。 而且由于并行执行会使我走得很远,所以我决定好的开始将是在进程和线程之间共享游戏映射,以便对其执行并行操作。 这在节点上是不可能做到的,所以我决定在CL(SBCL + Linux)中编写肉感的部分,并通过unix域套接字连接到它。 计划是: [players] <-> (node.js front server) <-> (SBCL performing game ticks) 重点是,我需要在node.js和SBCL之间传递类似于socket.io的快速消息。 这是什么没有工作(你可以跳过这一部分) 在Node端,我不能使用纯socket.io,因为它不支持Unix域套接字,但net模块,所以我可以至less做socket.write('raw data') – 现在好没有比什么都好。 在CL方面,我试图运行woo web服务器(它支持本地套接字),我可以从节点连接到它并传递原始数据,但是所有不必要的HTTP部分都涉及到,并且woo始终作为服务器运行。 它正在等待GET / HTTP/1.1 …. 我没有find一个方法来首先从woo发起一个消息。 另外,它是完全没有logging和未注释的,并且涉及很多对C库的FF调用,这些我都不太熟悉。 所以我又经历了几个没有编译的CL Web服务器,不支持unix套接字,被放弃或者没有logging,最终转移到了纯sb-bsd-sockets,最后转到了iolib,但是我仍然无法弄清楚。 iolib看起来很有前途,但我无法从节点连接到它。 我有这个: (with-open-socket (socket :address-family :local :type :datagram ;; :connect :passive :local-filename "/tmp/socket") (format t "Socket created") ;; (listen-on socket) ;; (bind-address […]

单个请求花费很长时间处理这些非阻塞的io服务器时会发生什么情况?

使用nodejs或eventlet或任何其他非阻塞服务器,当给定的请求花费很长时间会发生什么,然后阻塞所有其他请求? 例如,请求进来,需要200ms计算,这将阻止其他请求,因为例如nodejs使用单个线程。 意思是每秒钟15K的时间将大大减less计算响应给定请求所花费的实际时间的b / c。 但是这对我来说似乎是错误的,所以我在问真正发生的事情,因为我无法想象事情是如何运作的。

NodeJS – 单身+事件

我将如何inheritanceevents.EventEmitter方法实现单身devise模式的模块? var EventEmitter = require('events').EventEmitter; var Singleton = {}; util.inherits(Singleton, EventEmitter); Singleton.createClient = function(options) { this.url = options.url || null; if(this.url === null) { this.emit('error', 'Invalid url'); } else { this.emit('created', true); } } module.exports = Singleton; 这会导致错误: TypeError: Object #<Object> has no method 'emit'

如何将socket.io(在nodejs中)的事件处理程序绑定到我自己的作用域?

我在我的nodejs服务器中使用“socket.io”。 有没有办法在我的类/模块(在浏览器)范围内运行注册的事件function? … init: function() { this.socket = new io.Socket('localhost:3000'); //connect to localhost presently this.socket.on('connect', this.myConnect); }, myConnect: function() { // "this.socket" and "this.f" are unknown // this.socket.send({}); // this.f(); }, f: function() { // … } …

Node.js – 从模块发射事件的最佳方法

我一直在玩EventEmitter,但我很困惑我该如何从一个模块实现它。 我已经看到了几种不同的方式,他们似乎都工作。 这里有一些我见过的: 从这里 : var Twitter = function() {…}; Twitter.prototype = new events.EventEmitter; 但是在“掌握节点”中,他们这样做: function Dog(name) { this.name = name; EventEmitter.call(this); } Dog.prototype.__proto__ = EventEmitter.prototype; (为什么你需要打电话?) 然后在我自己的代码中,我尝试了另一种方式: function Class() {} Class.prototype = EventEmitter.prototype; 他们都是以自己的方式inheritanceEventEmitter,所以最简单的解决scheme不是最好的?

如何让我的NodeJS应用程序永远在循环中运行

我已经写了一个NodeJS应用程序调用一个API,并在特定的时间仅在工作日发布到端点。 我可以设置一个cron作业来在指定的时间运行应用程序,但我宁愿运行它与node index.js并不断运行,什么也不做,直到它是正确的一天和时间,然后回到“睡眠”直到第二天。 我如何做到这一点? 我试了一下while循环: while (true) { myApp.run(); } 显然那不太好。 什么是正确的方法来做到这一点? 我应该重写我的模块使用事件,以便我发出一个时间,并有一个对它作出反应的监听器? – 编辑:更具体地说,我希望它以类似的方式运行在其中的Web服务器的应用程序。 当你启动应用程序,它正在运行,并等待连接; 它在请求和连接结束时不会退出,它仍然在等待更多的请求和连接。 – 编辑2:我宁愿不使用cron的原因是因为运行的日子和时间可以在appparsing的config.json文件中configuration。 我宁愿避免与cron混淆,只需通过编辑config.json文件来更改计划。 – 编辑3:我想自己编码,而不是使用模块。 当我试图编写一个永远运行的应用程序时,我的大脑总是很痛苦,我想了解它是如何完成的,而不是使用一个模块。 – 编辑4:这是我最终使用: function doStuff() { // code to run }; function run() { setInterval(doStuff, 30000); }; run();

非阻塞(事件驱动的I / O)与阻塞I / O

最近我偶然发现了一个名为nodeJS的漂亮的JS库,它就像服务器端的JS一样。 语言的主要特点是使用I / O,它使I / O的固有容量完全无阻塞使用callback! 我的问题是,如果这种完全不阻塞的I / O机制过去存在(给定事件驱动的I / O已经存在很长时间了),为什么它们在C#和高级语言Java(尽pipeJava有支持非阻塞I / O的NIO实现)? 目前,简单的文件读/写操作导致完全的I / O阻塞,事件驱动的I / O不是这种情况。 我想更好地理解事件驱动的I / O,以及它与我们在Java中的不同之处。

libuv工作线程或工作队列运行状况检查?

在libuv中,最终可能会在工作线程中绑定太多的工作或错误的代码。 有一个简单的函数可以检查工作线程或线程队列的健康状况吗? 它不一定是100%确定性的,毕竟不可能确定工作线程挂在慢代码还是无限循环上。 所以下面的启发式都是好的: 尚未处理的排队项目数。 如果这太大,可能意味着工作线程繁忙或挂起。 libuv是否有任何线程处理机制,如果工作线程在n秒内不检查,它会被终止?

什么决定使用promises或setTimeout延迟函数的调用顺序?

推迟函数的执行,例如在自定义事件处理中,是JavaScript中的一种常见模式(参见这里的例子)。 它曾经是使用setTimeout(myFunc,0)是唯一的方法来做到这一点,但承诺现在有一个替代: Promise.resolve().then(myFunc) 。 我以为这些东西几乎可以做同样的事情,但在一个包含自定义事件的库上工作时,我想我会发现是否有差异,所以我把下面的块放到节点中: var logfn=function(v){return function(){console.log(v)}}; setTimeout(logfn(1),0); Promise.resolve().then(logfn(2)); logfn(3)(); 我期待在控制台3,1,2上看到,但是我看到了3,2,1。所以换句话说,Promise不等同于使用setTimeout,并且先出来块。 至less在Node中。 我在Chrome和Firefox中重复了testing,结果相同,但是在Edge中出现了3,1,2。我也希望非本地的promise库能够在后台使用setTimeout,所以会和Edge一样。 什么决定了这些呼叫的顺序被解决? 这些不同的环境使用什么模型来确定执行顺序? 以上任何一种情况是否代表标准或非标准行为? 附言我没有build议依靠任何这种保持一致,我只是好奇。 在下面给出的答案指出我正确的方向,正如在下面的评论中简要提到的,我在杰克·阿奇博尔德杰克·阿奇博尔德 ( 杰克·阿奇博尔德的一篇杰出的文章中find了完整的答案(与上面的代码几乎相同),我虽然我加在这里,而不是把它埋在评论里。