erlang 在gen_statem中自动更改状态

xa9qqrwz  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(192)

假设我有以下场景:我在状态机中有三个状态,用gen_statem编码,带有state_functions。从状态A到B,我需要一个触发器,但从状态B到C,我不需要,因为状态B将执行一些代码,然后将机器状态传递到状态C(名为Idle),等待其他输入。请查看下图,该图说明了状态机:

有没有可能做到这一点?到现在为止,我只能用触发器将状态传递到状态。

0ve6wy6x

0ve6wy6x1#

我从来没有用过,但我认为你可以通过行动来实现这一点。
在状态“A”中,当您接收到命令时,您可以在回调的返回值中定义下一个状态“B”和一个操作,该操作可能是将插入到事件队列顶部的事件,以便在您输入“B”时立即触发:

state_A({call,From},command,Data) ->
    NewData = do_something(Data),
    {next_state,state_B,NewData,[{next_event,cast,go_to_C},{reply,From,done}]}.

然后,在状态'B'中,您将立即收到go_to_C事件,并且您可以使用它自己的回调来处理它:

state_B(cast,go_to_C,Data) ->
    NewData = other_stuff(Data),
    {next_state,state_C,NewData}.

相关问题