我正在使用Socket.io来实现一个信令流程,比如连接、呼叫、应答、拒绝等等。还有onUserCalling、onUserRejected等。
我不知道处理所有状态的最佳方法是什么,例如,如果A正在呼叫B,那么此时A的状态将被设置为‘呼叫’,而B的状态将被设置为'onUserCalling‘。因此,同时C和A都不能调用B,因为它们的状态都不是“可用”。
但当事情变得复杂时,很难控制状态。
那么,有没有人知道关于这个问题的好材料/博客文章/模式?
提前谢谢。
发布于 2013-07-02 11:42:08
听起来你在找一个state machine。您可以在状态机上执行大量读取操作,但基本上它们表示可以处于任意数量的状态之一的事物;可以通过在机器上触发适当的事件来更改机器的状态。
在您的示例中,calling和onUserCalling是状态,call、answer、reject等是事件。通过将其表示为状态机,您可以跟踪用户所处的状态,以及用户可以根据事件转换到哪些状态。
例如,here is some code on Plunker that demonstrates such a state machine。(忽略用户界面交互是用AngularJS构建的这一事实。)状态机是通过一个名为JavaScript State Machine的库定义的,定义如下:
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状态,或者通过分别触发callAnswered或callRejected事件返回到ready。
状态机库可以查看事件定义,并根据机器的当前状态告诉您允许触发哪些事件。在本例中,我使用它只启用将触发允许的事件的按钮。
大多数状态机库,包括我在这里使用的JavaScript状态机,都允许您在进入或离开某些事件时提供回调;这个特定的库还允许异步事件转换,这在使用带有异步Node.js代码的库时可能会有所帮助。你可以在in the readme上找到更多信息。
https://stackoverflow.com/questions/17416350
复制相似问题