LD_STATE> - called before leaving <OLD_STATE>
//
// 4. leave_state - called before leaving all states
//
// 5. enter_<NEW_STATE> - called after entering <NEW_STATE>
//
// 6. enter_state - called after entering all states
//
// 7. after_<EVENT> - called after event named <EVENT>
//
// 8. after_event - called after all events
//
// There are also two short form versions for the most commonly used callbacks.
// They are simply the name of the event or state:
//
// 1. <NEW_STATE> - called after entering <NEW_STATE>
//
// 2. <EVENT> - called after event named <EVENT>
//
// If both a shorthand version and a full version is specified it is undefined
// which version of the callback will end up in the internal map. This is due
// to the pseudo random nature of Go maps. No checking for multiple keys is
// currently performed.
从上面我们知道了,d.enterState(e)
是在called after entering all states
时执行的。
2.2.1 完整版书写的Callbacks执行顺序
从上面的注释能知道完整版书写的Callbacks
的执行顺序如下:
2.2.2 简写版的Callbacks执行顺序
2.2.3 注意事项
虽然Callbacks
的写法有两种,但是不能同时使用完整版和简写版,否则最终使用那个版本是不确定的。
2.3 较为完整的例子
package main
import (
"context"
"fmt"
"github.com/looplab/fsm"
)
type Door struct {
Name string
FSM *fsm.FSM
}
func NewDoor(name string) *Door {
d := &Door{
Name: name,
}
d.FSM = fsm.NewFSM(
"closed",
fsm.Events{
{Name: "open", Src: []string{"closed"}, Dst: "open"},
{Name: "close", Src: []string{"open"}, Dst: "closed"},
},
fsm.Callbacks{
"before_open": func(_ context.Context, e *fsm.Event) { d.beforeOpen(e) },
"before_event": func(_ context.Context, e *fsm.Event) { d.beforeEvent(e) },
"leave_closed": func(_ context.Context, e *fsm.Event) { d.leaveClosed(e) },
"leave_state": func(_ context.Context, e *fsm.Event) { d.leaveState(e) },
"enter_open": func(_ context.Context, e *fsm.Event) { d.enterOpen(e) },
"enter_state": func(_ context.Context, e *fsm.Event) { d.enterState(e) },
"after_open": func(_ context.Context, e *fsm.Event) { d.afterOpen(e) },
"after_event": func(_ context.Context, e *fsm.Event) { d.afterEvent(e) },
},
)
return d
}
func (d *Door) beforeOpen(e *fsm.Event) {
fmt.Printf("beforeOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) beforeEvent(e *fsm.Event) {
fmt.Printf("beforeEvent, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) leaveClosed(e *fsm.Event) {
fmt.Printf("leaveClosed, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) leaveState(e *fsm.Event) {
fmt.Printf("leaveState, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) enterOpen(e *fsm.Event) {
fmt.Printf("enterOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) enterState(e *fsm.Event) {
fmt.Printf("enterState, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) afterOpen(e *fsm.Event) {
fmt.Printf("afterOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}
func (d *Door) afterEvent(e *fsm.Event) {
fmt.Printf(&qu