【问题标题】:Eventbus event orderEventbus 事件顺序
【发布时间】:2011-11-11 09:33:54
【问题描述】:

早上,

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

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

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

目前的解决方案:

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

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

问候, 斯蒂芬

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

【问题讨论】:

    标签: events gwt event-bus


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,所以它们是同步的。这解决了我可能遇到的很多问题:)
    【解决方案2】:

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

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

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

    【讨论】:

    • 第一次迭代会抛出一个列表而不是直接访问对象,这不是性能问题吗?顺便说一句,nett das noch jemand aus wien sich mit gwt beschäftigt^^^
    • 这取决于您如何实现它以及您的对象中有多少级别/层次结构。 GWT 的新CellWidgets(CellTree 等)使用普通列表(DataProvider)来构建自己。性能方面最大的瓶颈是创建 DOM 结构。遍历列表的性能影响是可以忽略的。 CellWidgets 使用 setHTML 而不是创建复杂的小部件(具有大量 DOM 操作),这使得它们变得如此之快。如果列表很大,您仍然可以实现延迟加载等。我认为 4. 方法也使代码更简单。 Du bist auch aus Wien? dann sind wir schon mal 2;-)
    • 酷,这将是最终从“旧”gwt 树切换到新 CellTree 的原因......因为它会改变我当前的逻辑,但这只是一个关于我。如果有人有其他建议,我将把这个问题留一会儿:)。 Ja komme aus der nähe von wein。 arbeite gerade 和 der 4. html lösung für unsere desktop guid ;)。 Gwt ist schon verdammt cool und auch wahnsinnig schnell。 Macht mir echt spaß。顺便说一句,kann man auf stackoverflow keine nachrichten senden?
    • @Stefan:我在几个项目中使用 CellTree,我只能推荐它。实际上,我推荐使用 CellWidgets,因为它们非常快,尤其是处理大量数据并且具有良好的 API。 Man kann keine Nachrichten schicken, aber ich bin 在 dem GWT Stackoverflow 聊天中:chat.stackoverflow.com/rooms/4916/gwt?highlights=true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多