Middleware sitzt zwischen dem Versand einer Action und der Action, die den Reducer erreicht, und ermöglicht es dir, Actions abzufangen, um Nebeneffekte (asynchrone API-Aufrufe, Logging) zu behandeln — was Reducer nicht tun können, weil sie rein bleiben müssen. Thunks sind die häufigste Middleware und ermöglichen asynchrone Logik.
Wo Middleware passt
dispatch(action) → [ middleware 1 → middleware 2 → ... ] → reducer → store
(can inspect, modify, delay, or stop actions; do side effects)
