Portrait of Tom Sansome

Tom Sansome

XState: Using `invoke` and `always` when loading data inside a state machine

Code

When using the invoke property to load external data you'll likely make use of the onDone and onError properties:

invoke: {
  src: 'getDataService',
  onDone: 'success',
  onError: 'failure',
},

If you want to immediately do something with that successfully loaded data you can use the always property inside the success state with some conditions:

success: {
  always: [ // <--- The good bit
    {
      target: 'incomingSession',
      cond: 'isIncomingSession',
    },
    {
      target: 'sessionActive',
      cond: 'isSessionActive',
    },
    ...
  ]
}

This is saying: When entering the success state, always go to one of the target states based on the given condition (cond). For example; if the current session is active (isSessionActive), go to the sessionActive state.

This is something that took a little while to click for me when learning XState, so hopefully this is helpful!


This state machine was used as part of the Saving Sessions campaign at Octopus Energy 👇

Saving sessions website

The dashboard for this project has a total of 11 states it could possibly be in, so a state machine felt right for this one.