2013-07-02 49 views
1

我使用Socket.io实现信令处理,如连接,呼叫,接听,拒绝,等等,也onUserCalling,onUserRejected等任何资源......约信令过程

我不不知道处理所有状态的最佳方式是什么,例如,如果A正在调用B,那么A的状态将被设置为“调用”,而B的状态将为“onUserCalling”。因此,C可以打电话的意思是,既不是B也不是B,因为他们的地位不“可用”。

但是当事情变得复杂时,很难控制状态。

那么有没有人知道关于这个问题的好材料/博客文章/模式?

在此先感谢。

回答

0

这听起来像你正在寻找一个state machine。在状态机上可以做很多的读操作,但基本上它们代表的是可以在任何数量的状态之一;机器的状态可以通过在机器上触发适当的事件来改变。

在你的情况,callingonUserCalling状态callanswerreject等都是事件。通过将其表示为状态机,您可以跟踪用户处于哪种状态以及可以根据事件转换到哪些状态。

举一个例子,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,我们可以通过触发callAnsweredcallRejected事件分别移动到inCall状态或回到ready

状态机库可以查看事件定义并根据机器的当前状态告诉您允许哪些事件被触发。在这个例子中,我已经使用它来启用将触发允许事件的按钮。

大多数状态机库(包括我在此使用的JavaScript)允许您在进入或离开特定事件时提供回调;这个特定的库还允许异步事件转换,这可能有助于在使用具有异步Node.js代码的库时提供帮助。你可以找到更多的信息in the readme

+0

感谢您的回复。这真的有帮助!我会尝试使用你的lib来实现我想要的。 – Kos

+0

我很高兴你发现它很有用。值得一提的是,在那里有许多状态机实现;谷歌搜索会找到你几个我确定。我提到的不是我的,但我用它来做我自己的JavaScript的东西。 –

+0

了解,谢谢:) – Kos