Eventbus事件顺序

时间:2011-11-11 09:33:54

标签: events gwt event-bus

上午,

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

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

  • 他是否等到第一个事件完成,所以他的第一个孩子 树已经完成创建并将自己注册到 Eventbus,用于恢复数据以创建它的孩子。
  • 他是否同时处理它们,因此小部件甚至没有注册到Eventbus。
  • 他是否混淆了订单?!?!

当前的解决方案方法:

  1. 我能想到的最好的解决方案就是只把新事件放在上面 Eventbus在上一次完成之后。但是我发现了一种方法 这样做,或者它是Eventbus的标准行为。
  2. 在窗口小部件处理事件时触发处理完成事件的请求。 Yucks ...这会导致很多额外的代码并导致大问题,当数据放在不属于任何小部件的Eventbus上时....
  3. 注册一个静态变量,当处理请求时,该变量设置为true,并且Eventbus等待这一长时间,直到他将下一个请求放在Eventbus上(安静类似于两个,但编码风格和编码风格相同)
  4. 所有事件都由根树元素处理,根元素将它们向上发送到相应的子元素。
  5. 您更喜欢哪种解决方案?为什么?

    此致 斯蒂芬

    PS:我最喜欢的答案是1.是Eventbus ^^的标准行为 PPS:解决方案也应该在介绍Webworkers时进行。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

Javascript是单线程的,所以我认为你不能同时拥有两个事件。他们将一个接一个地执行。 如果你在EventBus上激活一个事件(即SimpleEventBus),它将只通过附加的处理程序列表进行迭代并执行它们。如果没有附加处理程序,则没有任

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