Articles of 事件处理

Node.js事件代理

我目前有一个解决scheme,但是我想从我的服务器代码中删除多余的操作。 我现在在我的快速应用程序中是这样的: // create a ZMQ socket connection var zmq_sock = require('zmq').socket('dealer').connect(ENDPOINT); // On a new socket.io connection from a client, register that client as a listener // to any zmq event, and unregister the client upon disconnect io.sockets.on('connection', function(socket) { var client_callback = function(id, msg) { // some expensive operation socket.emit('data', json_data); // socket.io […]

node.js EventEmitter导致范围问题

当使用nodejs事件系统时,我遇到了一个恼人的问题。 如下面的代码所示,当侦听器捕获一个事件时,事件发射器对象在callback函数中拥有“this”而不是侦听器。 如果将callback放在侦听器的构造函数中,这不是一个大问题,因为除了指针“this”之外,还可以使用构造函数作用域中定义的其他variables,如“self”或“that”。 但是,如果将callback放在构造函数之外(如原型方法),则在我看来,没有办法获得侦听器的“this”。 不太确定是否有其他解决scheme。 另外,为什么nodejs事件发出使用发射器作为监听器的调用者安装有点困惑? util = require('util'); EventEmitter = require('events').EventEmitter; var listener = function () { var pub = new publisher(); var self = this; pub.on('ok', function () { console.log('by listener constructor this: ', this instanceof listener); // output: by listener constructor this: false console.log('by listener constructor self: ', self instanceof listener); // […]

在特定情况下完全销毁对象和空闲内存(node.js)

我正在写一个程序,可以加载一些用户模块。 我的主程序有一个在程序和用户模块之间共享的对象列表。 现在交易是可以从列表中删除/添加这些对象。 他们是dynamic的。 在我自己的程序中,我可以确保对已删除项目的所有引用都设置为空,并清除所有侦听器。 (是否正确的方式来允许垃圾回收器处理的方式?)。 问题是,用户模块可以做任何他们想要的与被删除的对象。 他们可以添加列表器,参考它等等。在这种情况下,我怎样才能释放内存? 经过很长一段时间我的程序运行和许多添加/删除这些对象,我可能导致内存泄漏… 感谢进步。

什么是执行(显式和隐式)并行和在node.js中按顺序?

这个例子混淆了我对node.js如何工作的理解: // 1. numbers.forEach(function(number) { queue.push(Q.call(slowFunction, this, number)); }); // 2. // Q.all: execute an array of 'promises' and 'then' call either a resolve // callback (fulfilled promises) or reject callback (rejected promises) Q.all(queue).then(function(ful) { // All the results from Q.all are on the argument as an array console.log('fulfilled', ful); }, function(rej) { // The […]

从事件处理程序写入WriteStream

我有一个EventEmitter对象,我设置了侦听事件。 当事件发射时,我想写信息到文件。 我有一个开放的FileStream通过fs.createWriteStream(path, { flags: 'a'}); 目前,我的问题是,如果我经常以超快的速度发射事件,我就开始“备份”了。 IE .write返回false要求我停止写一会儿。 由于我在事件处理程序中进行写操作,因此附近没有用于指示写入过程结束的callback函数。 我可以从处理或排放方面做什么来防止备份? 最终,这似乎并不重要; 所有的数据都被写入文件。 但是我想尽可能地遵循“规则”。 我知道我可以听取drain事件,然后再开始写作,但是如何防止其他事件进入处理程序? 我注意到,如果我在每个发射之前放50ms延迟,备份似乎不会发生,但似乎有点像黑客。 另外如果你有一个较慢的硬盘? 以下是我的情况的一个例子: var ee = new EventEmitter(); var stream = fs.createWriteStream('./file/log.txt', { flags:'a'} ); ee.on('report', function (i) { stream.write('new file data ' + i + ' — ' + Date.now + '\n'); }); for (var i = 0; i […]

Node.js等待多个事件

如何以一种干净的方式等待多个事件被发射? 就像是: event.on(['db:mongo:ready', 'db:redis:ready', 'db:rethinkdb:ready'], function() { server.listen() });

如果侦听器尚未添加,并且侦听器处理程序是匿名函数,则在nodeJS中添加侦听器

有没有办法来检查一个侦听器是否已经存在的node.js中的对象? 我想要实现以下场景: 获取数据库的对象 做一些操作 添加监听器,如错误,结果,stream失等,如果相同的监听器尚未添加[假设对于所有的操作监听器操作是相同的] 我想优化添加侦听器的方式,如果我们尝试添加一个现有的侦听器,新的侦听器将不会被添加。 节点文档说:“ 不检查是否已经添加了侦听器。多个调用传递相同的eventName和listener的组合将导致添加和调用多个侦听器。 有没有办法解决它? [编辑] – 添加一些示例代码 connpool.getConnection(function(err, connection) { var querystr = "Some valid SQL query"; connection.execute(querystr, data, function(err, rows) { if (err) { console.error(err); } connection.on('error', function(err){onErr(err,connection);}); do some stuff cleanup(connection); }); }) var onErr = function(err, connection) { console.error({"Error message"}); connection.release(); cleanup(connection); }; var cleanup = function(conn) […]

如何理解Node.js事件循环

其实我现在正在学习node.js。 尽pipe我已经学习了许多关于node.js的东西,比如安装模块并使用它们,但我还没有理解node.js的实际核心function(事件循环和非阻塞I / O)。 我已经读了许多关于apache的multithreading和处理和JavaScript事件循环,但没有一个给我正确的来源,学习与良好的例子。 任何帮助,将不胜感激。 谢谢。

如何logging和跟踪NodeJS事件和事件处理程序的调用?

当事件处理程序获得注册时,有没有办法logging所有其他注册的事件处理程序? 还有什么办法可以logging所有发出的事件,以及在运行时发生事件时触发的处理函数的名字吗? 如果nodejs应用程序触发链式事件(一个事件触发另一个事件),并且每个事件都有多个处理程序,则当event-handler-chain的叶子发生exception时,stacktrace不会显示上下文的完整信息。 事件日志和处理程序信息在这种情况下非常有用。 一个hackey解决scheme是添加(条件)日志logging到https://github.com/joyent/node/blob/master/lib/events.js,但我相信肯定有一个更好的方法。

什么时候Node.js阻塞?

我已经使用了一段时间的Node.js,我刚刚意识到它可以阻止。 我只是不能把我的大脑围绕Node.js阻塞的条件。 所以,Node.js是单线程的,因为(i)Javascript是和(ii)避免了所有的multithreading陷阱。 尽pipe是单线程的,但是要立即做很多事情,它实现了asynchronous执行。 所以,与DB(一般的I / O)交谈是非阻塞的(因为它是asynchronous的)。 但是,所有传入的请求需要做一些工作(即与数据库交谈)以及必须返回给客户端的所有工作结果(即发送一些数据),他们使用该单个线程。 Node.js使用单线程内的“事件循环”来获取所有请求,并将其分配给非阻塞的I / O任务。 因此,由于asynchronouscallback,I / O任务是非阻塞的,但单线程可以阻塞,因为它是同步的,并且由于许多复杂的请求同时出现,事件循环可能被阻塞。 我是对的吗,我是否理解正确? 我猜,我不这样做,因为在这里和这里他们强调“节点是单线程,这意味着你的代码没有并行运行”。 这实际上是什么意思,它是如何使节点阻塞? 那么,事件循环会永远运行,并且总是search请求,或者在发现新的请求后开始执行? 节点阻塞弱点是否会使节点对大型项目无用,并最终只适用于微型站点和小型项目? 非常感谢。