Похоже, вы ищете машину состояний. О конечных автоматах можно много чего прочитать, но в основном они представляют вещь, которая может находиться в одном из любого количества состояний; состояние машины можно изменить, инициировав соответствующие события на машине.
В вашем случае calling
и onUserCalling
— это состояния, а call
, answer
, reject
и т. д. — события. Представляя это как конечный автомат, вы можете отслеживать, в каком состоянии находится пользователь и в какие состояния он может перейти в зависимости от событий.
В качестве примера вот код на Plunker, демонстрирующий такой конечный автомат. (Игнорируйте тот факт, что взаимодействие с пользовательским интерфейсом было построено с помощью AngularJS.) Конечный автомат определяется через библиотеку с именем Конечный автомат JavaScript и определяется следующим образом:
StateMachine.create({
initial: 'ready',
events: [
{ name: 'placeCall', from: 'ready', to: 'calling' },
{ name: 'receiveCall', from: 'ready', to: 'callWaiting' },
{ name: 'callAnswered', from: 'calling', to: 'inCall' },
{ name: 'callRejected', from: 'calling', to: 'ready' },
{ name: 'answerCall', from: 'callWaiting', to: 'inCall' },
{ name: 'rejectCall', from: 'callWaiting', to: 'ready' },
{ name: 'hangUp', from: ['calling', 'inCall'], to: 'ready' }
]
});
Это говорит о том, что когда машина находится в состоянии ready
, мы можем инициировать событие placeCall
, чтобы изменить состояние calling
, или мы можем инициировать событие receiveCall
, чтобы изменить состояние на callWaiting
. После изменения состояния на calling
мы можем перейти либо в состояние inCall
, либо обратно в ready
, инициировав события callAnswered
или callRejected
соответственно.
Библиотека конечного автомата может просматривать определение событий и сообщать вам, какие события разрешено запускать в зависимости от текущего состояния автомата. В примере я использовал это, чтобы включить только кнопки, которые будут запускать разрешенные события.
Большинство библиотек конечных автоматов, включая JavaScript, который я использовал здесь, позволяют вам предоставлять обратные вызовы, когда вы входите или выходите из определенных событий; эта конкретная библиотека также допускает асинхронные переходы событий, что может помочь при использовании библиотеки с асинхронным кодом Node.js. Дополнительную информацию можно найти в файле readme.
person
Michelle Tilley
schedule
02.07.2013