Hi, one issue I keep bumping into is - how do I queue or auto-transition to a state, from within transition event callback?
There are two related usecases for this:
- State machine should transition to the next state in a sequence of states, based on some condition
- Writing a unit tests for a state machine that may auto-transition to states, using
onTransition callback to trigger transitions before the next queued transition takes effect
My simplified state flow is something like this:
IDLE--start()-->DETECT_FACES--detected(faces)-->IDENTIFY_FACES-->identified(persons)-->DETECT_FACES-->detectedInTheMeantime(faces)-->IDENTIFY_FACES...
DETECT_FACES kicks of a face detector worker that runs asynchronously and triggers face-detected events.
IDENTIFY_FACES starts an asynchronous process to identify faces that can take several seconds.
So far I've accomplished this by storing a buffer of facesDetectedInTheMeantime outside the state machine and using setTimeout() to invoke the transition upon entering DETECT_FACES, but this seems very hackish to me and probably not very deterministic. Ideally, there was a way to queue transitions or a lifecycle event that is invoked after the transition has fully completed so you can enter new states from it, but maybe that would need to use a mechanism similar to setTimeout and not really gain anything.
Am I way off on the way I am thinking here?
Hi, one issue I keep bumping into is - how do I queue or auto-transition to a state, from within transition event callback?
There are two related usecases for this:
onTransitioncallback to trigger transitions before the next queued transition takes effectMy simplified state flow is something like this:
IDLE--start()-->DETECT_FACES--detected(faces)-->IDENTIFY_FACES-->identified(persons)-->DETECT_FACES-->detectedInTheMeantime(faces)-->IDENTIFY_FACES...DETECT_FACESkicks of a face detector worker that runs asynchronously and triggers face-detected events.IDENTIFY_FACESstarts an asynchronous process to identify faces that can take several seconds.So far I've accomplished this by storing a buffer of
facesDetectedInTheMeantimeoutside the state machine and usingsetTimeout()to invoke the transition upon enteringDETECT_FACES, but this seems very hackish to me and probably not very deterministic. Ideally, there was a way to queue transitions or a lifecycle event that is invoked after the transition has fully completed so you can enter new states from it, but maybe that would need to use a mechanism similar tosetTimeoutand not really gain anything.Am I way off on the way I am thinking here?