Javascript qooxdoo中的受控事件处理流 前言

Javascript qooxdoo中的受控事件处理流 前言,javascript,qooxdoo,Javascript,Qooxdoo,下面描述的问题可能是任何事件驱动的JS框架和任何处理传入数据/事件流的应用程序的主题。为了明确起见,让我们设想一个使用框架的基于web的IM(类似Facebook聊天) 应用程序接收传入的事件流(例如,通过WebSocket),并将事件重新发送到其内部类: 大致说来,事件的处理分为两个阶段。第一阶段的处理程序主要是警报(对传入的消息播放声音、显示等)。第二阶段是实际的数据处理和显示。当事件到达时,同时调用两个阶段处理程序 该模型在应用程序和处理程序之间提供了良好的代码解耦,允许独立地添加/删除

下面描述的问题可能是任何事件驱动的JS框架和任何处理传入数据/事件流的应用程序的主题。为了明确起见,让我们设想一个使用框架的基于web的IM(类似Facebook聊天)

应用程序接收传入的事件流(例如,通过WebSocket),并将事件重新发送到其内部类:

大致说来,事件的处理分为两个阶段。第一阶段的处理程序主要是警报(对传入的消息播放声音、显示等)。第二阶段是实际的数据处理和显示。当事件到达时,同时调用两个阶段处理程序

该模型在应用程序和处理程序之间提供了良好的代码解耦,允许独立地添加/删除和启用/禁用它们。然而

问题 …随着应用程序的发展,各阶段之间可能存在依赖关系。一些第1阶段处理程序应阻止第2阶段的处理程序(例如,在声音警报完成之前,传入的语音记录不应自动播放)。有些甚至可能显示用户确认,如果没有给出确认,则取消整个剩余链。qooxdoo中的事件处理假定(几乎)同时调用所有处理程序,并且对处理程序调用的顺序和时间没有控制

我们如何引入所需的控制,同时保持在事件模型中并且不牺牲其优点(低耦合等)

解决方案 候选解决方案采用。默认情况下,qooxdoo事件处理程序不返回任何内容。为什么不让他们(选择性地)回报承诺?在这种情况下,应引入承诺感知事件中介:

处理程序现在应该订阅中介(为了清晰起见,图中省略了这一点)。除了标准的
/
方法外,调解人还应实现一个
方法,该方法具有以下语义:

  • after(字符串名称、函数侦听器、var ctx?)
    -在此事件的所有其他处理程序之后调用处理程序
  • after(字符串名、整数id、函数侦听器、var ctx?)
    在具有已知id的另一个处理程序之后调用处理程序
  • after(字符串名称,(类|字符串)id,函数侦听器,var ctx?
    -在某个已知类的所有其他处理程序之后调用处理程序(可以从相应调用的
    参数派生)
因此,我们从两点扩展了现有的事件语义:

  • 事件处理程序现在可以返回承诺
  • 为事件发射器/中介器引入了
    after
    方法
发射器/中介器应该将依赖项和连接处理程序调用解析为相应的
then()
承诺块


建议的解决方案似乎满足了这两个要求:1)它实现了事件处理程序之间的依赖关系,2)它允许保持在事件处理范式内。有什么陷阱吗?能做得更好/更干净吗?欢迎任何批评和建议。

我认为评估这些想法的最佳方式是实施它们。。。你有什么代码可以分享吗?在上,您可能会找到一些人来讨论这个问题。Promissions正在集成到Qooxdoo中,并且正在审查一个pull请求(这个很酷的新功能主要是由您的问题引起的,因此感谢您的建议:))。pull请求是,如果您想看一看,请看一看-如果知道它解决了您的用例,那就太好了。