问题标签 [eventemitter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1803 浏览

javascript - node.js 中是否有通用机制来超时事件?

我正在学习 node.js,我能找到的大多数示例都是处理简单示例。我更感兴趣的是构建真实世界的复杂系统,并估计基于事件的 node.js 模型如何处理真实应用程序的所有用例。

我想应用的一种常见模式是,如果在特定超时时间内没有发生阻塞执行,则让其超时。例如,如果执行数据库查询需要超过 30 秒,那么对于某些应用程序来说可能太多了。或者如果读取文件需要超过 10 秒。

对我来说,带有超时的理想程序流类似于带有异常的程序流。如果某个事件未在某个预定义的超时限制内发生,则事件侦听器将从事件循环中清除,并改为生成超时事件。此超时事件将有一个备用侦听器。如果事件处理正常,那么超时监听器和事件监听器都会从事件循环中清除。

是否有用于超时处理和清理超时进程的通用机制?我知道某些类型(例如套接字)具有超时参数,但它不是适用于所有事件的通用机制。

0 投票
1 回答
2048 浏览

node.js - 如何在 node.js 中为自定义 EventEmitter 正确实现暂停/恢复

我正在构建一个报告服务,其中一个进程提交查询,检索令牌,然后将令牌交给另一个进程,我们从中查询报告服务并将结果流回。

鉴于此代码,我应该如何实现阻塞调用,直到暂停为假?

这是一个交互图,解释了我想要实现的目标:

  1. Web 浏览器向前端 Web 服务器请求报告
  2. 前端网络服务器向报告服务请求与特定查询相关的令牌
  3. 同时,报告服务连接到 PostgreSQL 并发送查询
  4. 前端网络服务器将报告服务的 URL 和令牌返回给网络浏览器
  5. Web 浏览器使用返回的令牌向报告服务发出 Ajax(长轮询)请求
  6. 报告服务在行返回 Web 浏览器时对其进行流式传输

因为一切都是异步的,所以第 3 步可能会在 Web 浏览器连接之前开始返回数据,这意味着数据丢失。我可以在内存中缓冲数据,直到客户端回来,但我宁愿阻止数据行的发射,因为这会阻止 RAM 的使用。或者也许我只是在开玩笑,RAM 仍然会在底层库中使用?无论如何,指针表示赞赏!

0 投票
2 回答
6207 浏览

javascript - 如何在 Node.js 中编写非阻塞代码?

我可以非常轻松地在Node.js中编写非阻塞I/O 。这是整个图书馆的目的。

但是完成的任何计算都是阻塞的。任何通过事件发射器的消息都是阻塞的

例如,发出事件会立即解决,因此是阻塞的:

除了包装调用nextTick,我如何使代码非阻塞?

我希望在事件循环的每个周期中尽可能少地进行计算,以便我可以同时为尽可能多的客户端提供服务。

如何以非阻塞方式编写代码?

当我有非阻塞代码时,如何跨多个进程扩展它?

一种选择是等待 WebWorker 子流程 API 完成。

0 投票
2 回答
1119 浏览

file-io - 在 node.js 中的 writestream 上进行多次写入

我一直在查看 node-dirty 的代码,并注意到在将大量数据写入文件时,原始程序员选择将写入分成几个组并一次发出一个组的写入,但他们作为一个循环的一部分同时发出,无需等待任何回调。我对此有三个问题。我有一个类似的问题要解决。

  1. 这在某种程度上更有效吗?我也应该捆绑写作吗?
  2. 我应该如何选择最佳的捆绑包大小?为什么不写一组呢?
  3. 如果我在 writestream 上注册 on('drain') 事件,它会在所有同时发出的写入完成后仅发出一次吗?还是在每个之后?(我的猜测是前者)
  4. 如果发出 on('error') 事件,是否也会发出 ('drain') 事件?还是它们相互排斥?

谢谢

0 投票
1 回答
397 浏览

javascript - 删除 node.js 事件,监听器也会消失?

如果我删除一个 node.js 事件,监听器也会消失,对吗?我不需要删除其他任何东西吗?

0 投票
1 回答
863 浏览

javascript - node.js eventemitter 创建多个对象还是依赖参数?

询问 node.js 中的事件发射器

对于不同的事件,我是否应该在基础对象上创建新的发射器:

或依靠论据触发

推荐什么?

谢谢。

0 投票
2 回答
4775 浏览

javascript - Node.js - 从模块发出事件的最佳方法

我一直在玩EventEmitter,但我对我应该如何从模块中实现它感到困惑。我见过几种不同的方法,它们似乎都有效。以下是我见过的一些:

这里

但是在“Mastering Node”中,他们这样做了:

(为什么需要 .call 呢?)

然后在我自己的代码中,我尝试了另一种方式:

他们都只是以自己的方式从 EventEmitter 继承,那么最简单的解决方案不是最好的吗?

0 投票
1 回答
777 浏览

javascript - 在一个以每个对象为一个类的 NodeJS 游戏中,应该如何处理事件?

在 Javascript/NodeJS 游戏中处理多个类时,我无法确定哪个类应该发出事件以及哪些类应该监听。我正在按照本指南创建事件驱动游戏: http: //pragprog.com/magazines/2011-08/decouple-your-apps-with-eventdriven-coffeescript

我正在编写一个小游戏,并将我的类分成以下控制器:

world - 创建游戏世界并通过多个“回合”来确定一些简单的游戏逻辑(即角色应该移动,塔应该射击)。

塔 - 塔位于 10x10 网格上并有一个范围。当一个物体进入射程时,它可以射击。

暴徒(敌人) - 暴徒在 10x10 网格上生成,每 3 秒移动一次。在某些时候,它会在塔的范围内徘徊。

我整天都在阅读有关 EventEmitters 的信息,但似乎无法找出构建我的事件的正确方法。生物在移动时是否应该触发事件,而塔是否应该监听“移动”事件?或者世界应该控制所有的事件,而塔/暴徒应该听世界?

请参阅下面的示例代码。

背景:我一直在为 NodeJS 开发一个简单的 TowerD 游戏,并决定首先实现服务器。我将所有实体存储在 MongoDB 中,并使用地理空间计算来确定对象是否在拍摄范围内。目前我正在使用一个基本的 3 秒循环来“勾选”游戏和进度逻辑,但我想转向一个真正的事件驱动模型并且正在苦苦挣扎。

世界:

(见完整的world.coffee:https://github.com/bdickason/node-towerd/blob/master/controllers/world.coffee

塔:

(查看完整的towers.coffee:https://github.com/bdickason/node-towerd/blob/master/controllers/towers.coffee

小怪:

(参见 mobs.coffee 的完整来源:https ://github.com/bdickason/node-towerd/blob/master/controllers/mobs.coffee )

项目完整来源:https ://github.com/bdickason/node-towerd

任何活动帮助将不胜感激。我已经在 github 上倾倒了大约 15 个 nodejs 游戏,还没有发现有人使用这种模式:(

0 投票
2 回答
6545 浏览

node.js - Nodejs 回调或 eventEmitter

这是编写nodejs代码的最佳实践。

我当前的代码中有很多回调,降低了可读性。

有什么建议吗?

0 投票
3 回答
6221 浏览

javascript - Nodejs EventEmitter - 定义侦听器函数的范围

我想要这样的工作:

但是,不幸的是,监听器甚至没有被调用。有没有办法用 EventEmitter 做到这一点?我可以Function.bind对听众,但是,我真的希望EventEmitter有一些特殊的(或明显的;)方法来做到这一点......

谢谢您的帮助!