4

早晨,

我正在使用SimpleEvent总线将数据从我的集中式数据恢复器发送到小部件。这真的很好,我从服务器获得一组新数据,RPC调用的成功方法将它放在Eventbus上,每个小部件都会查看数据是否适合它,如果是,它会“显示”它,如果不是,它什么都不做。每个请求只有一个数据集,小部件不依赖于已经发送的其他数据。

现在我有一个 Tree 小部件。树的子节点也被创建并抛出此数据集,并且此子节点将自身注册到 Eventbus 以恢复其子节点的数据。数据应在匆忙中接收(出于性能原因obv),因此我将获得多个数据集,这些数据集“同时”(在for循环中)放在Eventbus上。我只控制它们放在那里的顺序(首先是根,然后是第一个孩子的数据......)。Eventbus 现在如何进行活动?

  • 他是否等到第一个事件完成,所以树的第一个孩子已经完成创建并将自己注册到 Eventbus,以恢复数据以创建它的孩子。
  • 他是否同时处理它们,所以小部件甚至没有注册到 Eventbus。
  • 他把顺序弄乱了吗?!?!

目前的解决方法:

  1. 我能想到的最佳解决方案是仅在前一个事件完成后才将新事件放在 Eventbus 上。但是我找到了一种方法,或者它是 Eventbus 的标准行为。
  2. 当小部件处理事件时,触发请求处理完成事件。哎呀......当数据放在不属于任何小部件的事件总线上时,这会导致大量额外代码并导致大问题......
  3. 注册一个静态变量,当请求得到处理时设置为 true,Eventbus 等待这么长时间,直到他将下一个请求放在 Eventbus 上(安静类似于两个,但更糟糕的编码风格和同样的问题)
  4. 所有事件都由根树元素处理,根树元素将它们向上发送到相应的子元素。

您更喜欢哪种解决方案,为什么?

问候,斯特凡

PS:我最喜欢的答案是 1. 是 Eventbus 的标准行为^^ PPS:解决方案也应该在引入 Webworkers 时起作用。

4

2 回答 2

7

EventBus#fireEvent是同步的。这是设计使然。您可以将事件传递给总线,让处理程序修改它,当执行返回到您的方法时,您可以检查事件;这用于PlaceChangeRequestEvent和它setMessage的例子。

仅供参考,如果处理程序抛出异常,它不会阻止其他处理程序被执行。然后fireEvent将把异常(复数;几个处理程序可以抛出)包装在一个UmbrellaException.

于 2011-11-12T15:06:40.053 回答
3

尽管 EventBus 是一种很好的解耦应用程序部分的方法,但这并不意味着它应该被“过度使用”。
我还认为您应该注意不要通过引入类似同步/阻塞的行为来规避客户端代码的异步行为。

Javascript是单线程的,所以我认为你不能同时有两个事件。他们将一个接一个地被处决。如果您在 EventBus 上触发一个事件(即SimpleEventBus),它只会遍历附加的处理程序列表并执行它们。如果没有附加处理程序,则不会发生任何事情。

我个人更喜欢第4个。特别是如果您计划在将来的某个时间使用 CellTree。Tree 小部件/CellTree 小部件通过遍历对象来处理事件并构造其结构。

于 2011-11-11T12:24:33.073 回答