1

我正在使用 Socket.io 来实现一个信号过程,例如连接、呼叫、应答、拒绝等……以及 onUserCalling、onUserRejected 等……

我不知道处理所有状态的最佳方法是什么,例如,如果 A 正在呼叫 B,那么 A 的状态将设置为“正在呼叫”,而 B 的状态将是“onUserCalling”。因此,与此同时,C 既不能调用 A 也不能调用 B,因为它们的状态不“可用”。

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

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

提前致谢。

4

1 回答 1

0

听起来您正在寻找状态机。您可以在状态机上进行大量阅读,但基本上它们代表的事物可以处于任意数量的状态之一;可以通过触发机器上的适当事件来更改机器的状态。

在您的情况下,callingandonUserCallingstates, and call, answer,reject等是events。通过将其表示为状态机,您可以跟踪用户所处的状态以及他们可以根据事件转换到哪些状态。

例如,这里有一些 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,我们可以通过触发or事件分别移动到该inCall状态或返回到该状态。readycallAnsweredcallRejected

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

大多数状态机库,包括我在这里使用的 JavaScript 库,都允许您在进入或离开某些事件时提供回调;这个特定的库还允许异步事件转换,这在将库与异步 Node.js 代码一起使用时可能会有所帮助。您可以在自述文件中找到更多信息。

于 2013-07-02T03:42:07.750 回答