同步发射事件是不正确的?

时间:2012-03-02 01:25:13

标签: javascript api events

  

在任何将存在的系统中,附加侦听器都是异步的。   任何使用事件驱动样式的系统都会发出异步事件。   没有任何妥协,以任何其他方式这样做是错误的

事件发射是否总是异步的?

4 个答案:

答案 0 :(得分:1)

应该。

事件发射器只不过是一个大循环,它为给定的事件(字符串)调用许多函数。想象一下,事件中有数千或数十万个绑定侦听器(函数),我们需要调度该事件类型。如果该调度同步发生,我们将挂起并拧紧整个应用程序,直到调用所有函数。由于事件发射器通常与松散耦合的体系结构齐头并进,因此这将是可怕的。

在这个过程中肯定会有某种不同步。

答案 1 :(得分:0)

有一些使用事件发生器同步使用的用例,因为有设计模式的味道,但我认为这没有多大意义。如果这实际上是您的应用程序正在执行的操作,则应始终尝试在调用其他所有函数时调用函数。同步事件发射器并非完全不常见,但我认为它们是一个糟糕的设计选择,应该避免使用。

我还应该提一下,当您想要模拟为测试目的而发生的事件时,同步事件发射器在JavaScript中是有意义的,但我认为它应该由异步事件发射器驱动。

答案 2 :(得分:0)

不,不应该。

仅仅因为你发射事件并不意味着发射或处理需要是异步的。

您的事件处理不应该依赖于同步运行。

作为示例,大多数GUI框架都是基于事件的,并在单个线程中运行。

答案 3 :(得分:0)

这是一个老问题,但我不同意这些回应。我认为正确答案是没有始终正确的答案。人们已经列举了异步的原因,并且这些原因是有效的,但在其他情况下,同步更可取。我使用的PubSub库方便地使用publish()和publishSync()方法来允许两者(默认为异步)。

您希望同步的一种情况是您希望所有侦听器在事件发生时都能访问当前状态。

关于异步调用是非阻塞的参数,因此允许单线程UI更新(如在JavaScript中),这是正确的。如果你有一个不断更新的用户界面(即动画),如果你现在做一些耗费时间而不是耗时的“以后”,那就不重要了;无论哪种方式都很耗时,它会阻止动画并降低帧速率。我有时更喜欢将所有这些同步,因为运行到完成有好处,我可以更轻松地测试和配置文件,以确保所有我的听众正在累积处理事件中的事件1 / fps时间。异步监听器不仅可以降低成本,还可以使分析变得更加棘手。

“不知道”在构造时或构建时想要调用哪些侦听器,组件之间没有意识到哪些侦听器与“不知道”之间的区别是“你不知道”能够知道应用程序中存在哪些其他组件以及谁已注册监听器。可以说,即使你是唯一的程序员,假装在后一种意义上不知道也是有好处的(例如,这允许你不要对你自己的代码库的未来变化做太多假设),但是它也可以说你作为一个人,应该知道基本上这5个组件注册了十几个听众来做这么多的工作,而不是有可能无限数量的听众在做谁知道什么工作。后者往往是极端(过早?)优化。简单地调用异步的想法允许一个人不知道后者是有缺陷的。 Async不会神奇地购买无限的处理时间。个别听众也不能比发射器或程序员更了解他们被允许处理多长时间。 (好吧,如果事件系统包含此信息,它们就可以了,但这超出了pubsub模式。)