javascript-конечный автомат onafterevent не вызывается - PullRequest
2 голосов
/ 23 марта 2012

Я использую превосходную библиотеку 'javascript-state-machine' .Однако, с моими событиями, которые выглядят как A), у меня есть несколько обратных вызовов перехода, которые выглядят как B).У меня есть аналогичный обратный вызов onafterevent, который работает в другом месте.Но 'onafterEEpart' не стреляет, и я не могу понять, почему.

Я i) вызываю 'my-state-machine.EEpart' , что должно вызывать обратные вызовы на протяжении всего перехода.И ii) 'onbeforeEEpart' вызывается.Так что я в недоумении, почему этот onafterevent не называют.

Кто-нибудь видел что-нибудь подобное раньше?Заранее спасибо.

A)


    esm : StateMachine.create({
                               initial:  'Es',
                               events: [
                                 { name: 'EsE', from: 'Es', to: 'E' }, 
                                 { name: 'EEpart', from: 'E', to: 'Epart' },     
                                 { name: 'EpartE', from: 'Epart', to: 'E' },
                                 { name: 'EEs', from: 'E', to: 'Es' }
                               ]

B)


    onbeforeEEpart: (event, from, to, args) ->
    ... 

    onafterEEpart: (event, from, to, args) -> 
    ...

ОБНОВЛЕНИЕ [23/23/2012;2:49 утра]

Я попытался вручную перейти с Epart-> E, и получил ошибку в A).Кажется, переход из E-> Epart так и не завершился.И у меня есть теория, почему.

После предыдущего перехода мне пришлось прикрепить следующий переход к функции щелчка, как показано на рисунке B).Выполнение этого включало использование подчеркивания для повторного связывания моей функции перехода с моим конечным автоматом.Я думаю, что это вызывает ошибку.И если это так, есть ли правильный способ передать функции перехода для запуска?

Спасибо

A)


    Uncaught event EpartE inappropriate because previous transition did not complete

B)


    onafterPreviousEvent: (event, from, to, args) ->
      console.log('END Transition from Es->E')

      $(my-element)
        .bind('click',
              { fu: bar }, 
              _.bind(args.data.esm.EEpart, args.data.esm))   # state machine is 'args.data.esm'

1 Ответ

2 голосов
/ 24 марта 2012

Хорошо, я решил это. Оказывается, у меня была функция события onleaveE , которая возвращала флаг StateMachine.ASYNC. Рабочий процесс обратного вызова приведен ниже, и onleaveE вызывается и возвращает флаг ASYNC до того, как onafterEEpart может быть вызвано:

  • onbeforeevent - выстрелил до события
  • onleavestate - срабатывает при выходе из старого состояния
  • onenterstate - срабатывает при входе в новое состояние
  • onafterevent - запускается после события

Как правило, когда вы возвращаете флаг StateMachine.ASTNC, вы должны вручную вызвать transition () для вашего объекта stateMachine. Это сложно, и у меня был на день или около того. Надеюсь, это поможет кому-то в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...