gpt4 book ai didi

java - 事件驱动编程 - node.js、Java

转载 作者:行者123 更新时间:2023-12-03 11:11:28 24 4
gpt4 key购买 nike

我来自 Java,但最近一直在做一些 Node.js,并且一直在研究 Node 中的 EventEmitter 模块。

我不明白事件驱动编程和“常规”编程之间的根本区别。

这里有一些伪代码来演示我的“事件驱动”编程思想。

EventEmitter ee = new EventEmitter();
Function f = new SpecialFunction();

ee.on('grovel',f);

ee.emit('grovel'); //calls function 'f'

EventEmitter 对象似乎正在做的唯一工作是在事件的字符串表示形式(在本例中为“grovel”)和要响应的函数之间创建哈希关系。看起来就是这样,没有什么魔力。

但是,我的问题是 - 事件驱动编程如何在幕后真正使用鼠标单击和打字等低级事件进行工作?换句话说,我们如何在程序中将一次点击转化为字符串(如“grovel”)?

最佳答案

好的。我会尝试一下。

使用事件发射器有几个主要原因。

主要原因之一是浏览器(JavaScript 的诞生地)有时会强制您这样做。无论您是使用 jQuery 还是其他框架/库或其他方式将事件直接连接到 HTML 中,底层代码仍然基本相同(呃,基本上...)

所以首先,如果您想对键盘或鼠标事件使用react,就像您提到的那样,您可以直接硬绑定(bind)到事件处理程序(回调),如下所示:

<div onclick="myFunc(this)">Click me</div>

...或者您可以通过 DOM 引用在 JS 中执行完全相同的操作:

document.getElementById('my_element').onclick = function (evt) {
alert('You clicked me');
};

这曾经是我们连接点击处理程序的主要方式。此模式的一个致命缺点是您只能将一个回调附加到每个 DOM 事件。如果您想要对同一事件使用react的第二个回调,则需要将其写入现有的单击处理程序中,或者构建一个委托(delegate)函数来处理调用这两个函数的工作。另外,您的事件发射器最终会与事件监听器紧密耦合,这通常是一件坏事。

随着应用程序变得越来越复杂,使用事件监听器变得更有意义。浏览器 vendor (最终)决定采用单一方法来实现此目的:

// Build the handler
var myHandler = function (evt) {
alert('You clicked me too');
window.myHandlerRef = this; // Watch out! See below.
};

// Bind the handler to the DOM event
document.getElementById('my_element').addEventListener('click', myHandler);

此模式的优点是您可以将多个处理程序附加到单个 DOM 事件,或者从多个不同的 DOM 事件调用一个事件处理程序。缺点是您必须小心不要泄漏:根据您编写它们的方式,事件处理闭包(如上面的 myHandler)可以在它们附加到的 DOM 元素之后继续存在已被销毁并被GCed。这意味着最好始终执行 removeEventListener('click', myHandler)。 (有些库有一个 off() 方法可以做同样的事情)。

此模式也适用于键盘事件:

var giveUserAHeadache = function (evt) {
alert('Annoying, isn\'t it?');
};

document.addEventListener('keypress', giveUserAHeadache);

好的。这就是通常处理 native 浏览器事件的方式。但开发人员也喜欢在自己的代码中使用这种事件委托(delegate)模式。您想要这样做的原因是为了尽可能地解耦代码。

例如,在 UI 中,您可以在每次用户浏览器离线时发出一个事件(例如,您可以观看 navigator.onLine)。也许您可以在页眉上显示绿色/红色灯来显示在线状态,也许您可​​以在离线时禁用所有提交按钮,并且还可以在页脚中显示警告消息。使用事件监听器/发射器,您可以将所有这些编写为完全解耦的模块,并且它们仍然可以同步工作。如果您需要重构 UI,您可以删除一个组件(例如灯),用其他组件替换它,而不必担心搞砸其他模块中的逻辑。

作为另一个示例,在 Node 应用程序中,您可能希望数据库代码向特定 Controller 发出错误条件并记录错误 - 还可能发送电子邮件。您可以看到如何迭代地添加这些东西。使用事件监听器,这种事情很容易做到。

您可以编写自己的模式,也可以使用特定环境中可用的任何模式。 jQuery、Angular、Ember 和 Node 都有其特定的方法,但您也可以自由地构建自己的方法——我鼓励您尝试。

这些都是同一基本思想的变体,并且确切的定义或最正确的实现存在很多模糊之处(事实上,有些人可能会质疑这些是否完全不同)。但罪魁祸首如下:

  1. Observer
  2. Pub-Sub
  3. Mediator

关于java - 事件驱动编程 - node.js、Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com