dispatch<T> method

Future<T> dispatch<T>(
  1. Action action
)

Execute action through middleware chain

Implementation

Future<T> dispatch<T>(Action action) async {
  Action currentAction = action;

  // Execute before middleware
  for (final middleware in _middlewares) {
    currentAction = await middleware.before(currentAction) ?? currentAction;
  }

  // Execute action
  T result;
  try {
    result = await currentAction.execute() as T;
  } catch (e, stackTrace) {
    // Execute error middleware
    for (final middleware in _middlewares) {
      await middleware.onError(e, stackTrace, currentAction);
    }
    rethrow;
  }

  // Execute after middleware
  for (final middleware in _middlewares) {
    await middleware.after(currentAction, result);
  }

  return result;
}