прежде всего спасибо @Rob за ваш ответ.В конце концов я решил пойти с пользовательским решением.
Поэтому я просмотрел некоторые другие реализации управления потоком JavaScript
А именно:
Поток
https://github.com/bemson/Flow/wiki/Flow-Use-Cases
Где вы можете определить поток приложения (порядок вызова функций javascript) в предопределенном синтаксисе.
Мне особенно понравилась идея функций до и после условия (_in и _out) в Flow, которые выполняются до входа в состояние в потоке приложения и выхода из состояния.Кроме того, идея массива _vars, прикрепленного к определенному состоянию потока, была довольно интересной.
См. https://github.com/bemson/Flow/wiki/Using-Flow#s3-1 для получения дополнительной информации.
Джеймс Мак Парлан, Джеймс Мак Парлейн, разработал конечный автомат(FSM) в JavaScript, где он описывал поток приложения в 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-finite-state-machines-in-web-development/
для получения дополнительной информации.
Некоторое другое решение, которое я нашел у Камило Азулы, является своего рода смесью между наблюдателем и шаблоном команды.
http://camiloazula.wordpress.com/2010/10/14/fsm/
Где он использует именованные константы дляопределите штаты и оповестите наблюдателей об изменениях штатов.
Михаэль Шуериг написал об этой теме, но, к сожалению, его источники больше не в сети.В любом случае его концепция основана на цепочке методов, как вы, вероятно, знаете это из jQuery и других JS Frameworks.
Наконец, у 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, который использует язык выражений Springs, что мне очень интересно.
В любом случае мой конечный продукт будет основан на определении потока, аналогичном определению Джеймса Мак Парлана, но в отличие от его подхода я проанализирую XML, который определяет поток приложения на стороне сервера.
На основе этого XML я прикреплю javascript к каждой странице (каждая страница имеет свой собственный XML), который содержит соответствующий поток приложений.Поскольку наша система основана на ExtJS, я буду использовать функцию
http://docs.sencha.com/ext-js/4-0/#/api/Ext.EventManager-method-addListener
addListener
для управления потоком приложений на основе пользовательских событий.
Я надеюсь, что это будетпомогите кому-нибудь в будущем.
С уважением
JS