首先感谢@Rob 的回答。我最终决定采用自定义解决方案。
因此,我查看了其他一些 javascript 流控制实现
即:
流
https://github.com/bemson/Flow/wiki/Flow-Use-Cases
您可以在其中以预定义的语法定义应用程序流(javascript 函数调用顺序)。
我特别喜欢 Flow 中的前置和后置条件函数(_in 和 _out)的想法,这些函数在进入应用程序流中的状态和退出状态之前执行。此外,附加到特定流状态的 _vars 数组的想法很有趣。
有关更多信息,请参阅https://github.com/bemson/Flow/wiki/Using-Flow#s3-1。
James Mc Parlane 用 JavaScript 开发了一个有限状态机 (FSM),他用 XML 而不是纯 JavaScript 描述了应用程序流。我发现这是个好主意,但他所做的是在客户端而不是服务器端解析 XML。这对我来说是一个缺点。
无论如何。他描述了这样的状态
<fsm>
<states>
<state name="Start">
<enter call="initApp();" />
<exit call="exitApp();" />
<to>
<from state="" call="displayStartPage();" />
<from state="loggedOut" call="showLogoutMessage();displayStartPage();" />
</to>
</state>
<state name="loggedIn">
<include state="authenticated" />
<exclude state="loggedOut" />
<negate state="loggedOut" />
</state>
</states>
</fsm>
他使用以下可能的标签
<fsm> ... the root node of the fsm (I renamed it to better reflect the purpose)
<states> ... a collection of possible states (a state can have sub-states)
<state> ... a possible state
<exclude> ... if a state is active excluded one should be inactive
<include> ... if a state is active the included state should also be active
<require> ... should check that a javascript condition is true
<unrequire> ... the negation of <require>
<negate> ... negate a state if you enter another state
<affirm> ... make another state active, if entering a specific state
<enter> ... fire a trigger when state gets active
<exit> ... fire a trigger when state gets in-active
<from>/<to> ... specify state transitions and actions according to these transitions
<lock> ... lock state, until state machine is reset
此外,可能需要一些便利功能。命名视图:
testState ... to test the state of the FSM
negateState ... negate a state
affirmState ... set a new state and issue according transition events
flipState ... set state from active to inactive and vice versa
determine ... determine current state
请参阅
http://blog.metawrap.com/2008/07/21/javascript-finite-state-machinetheorem-prover/
和
http://blog.metawrap.com/2008/09/25/practical-applications-of-有限状态机在网络开发中/
以获取更多信息。
我从 Camilo Azula 找到的其他一些解决方案是观察者和命令模式之间的混合。
http://camiloazula.wordpress.com/2010/10/14/fsm/
他使用命名常量来定义状态并通知观察者状态变化。
Michael Schuerig,写过关于这个话题的文章,但不幸的是,他的资源不再在线。无论如何,他的概念是基于方法链接的,你可能从 jQuery 和其他 JS 框架中知道它。
最后,IBM 也有一个专注于这个主题的教程
http://www.ibm.com/developerworks/library/wa-finitemach1/
http://www.ibm.com/developerworks/library/wa-finitemach2/
http://www.ibm.com/developerworks/library/ wa-finitemach3/
但说实话,我不是很喜欢它。
现在我正在深入研究 Spring 的 Web Flow,它使用 Springs 表达式语言,我觉得这很有趣。
无论如何,我的最终产品将基于类似于 James Mc Parlane 的流定义,但与他的方法相反,我将解析定义服务器端应用程序流的 XML。
基于此 XML,我将在包含相应应用程序流的每个页面(每个页面都有自己的 XML)上附加一个 javascript。因为我们的系统是基于 ExtJS 我将使用
http://docs.sencha.com/ext-js/4-0/#/api/Ext.EventManager-method-addListener
addListener
根据用户事件引导应用程序流的功能。
我希望这将有助于将来的某人。
问候
JS