Es ist ein Fehler, den man nicht sieht: Der Effekt läuft beim ersten Mal, tut genau das Richtige — und danach passiert nichts mehr. Keine Fehlermeldung, kein roter Test. Nur eine Ansicht, die stehen bleibt.
Abhängigkeiten werden synchron gesammelt
Ein Signal benachrichtigt seine Leser, wenn sich der Wert ändert. Wer als Leser zählt, ermittelt Angular dynamisch: Nur Signals, die während des Durchlaufs tatsächlich gelesen wurden, werden zu Abhängigkeiten.
Diese Erfassung endet beim ersten await. Was danach kommt, läuft in einem
späteren Tick — und zählt nicht mehr dazu. Ein effect(), der sein Signal erst
nach dem await liest, registriert also keine einzige Abhängigkeit. Er
läuft einmal und nie wieder.
Das Gegenmittel ist unspektakulär: die Signals ganz oben lesen, in lokale
Variablen, und erst danach await. Umgekehrt gibt es untracked() für den
Fall, dass man einen Wert braucht, aber nicht auf ihn reagieren will.
Meistens ist der Effekt selbst das Problem
Die häufigere Ursache ist ohnehin, dass da gar kein Effekt hingehört. Einer,
der zwei Signals von Hand synchron hält, ist fast immer ein computed(), das
noch nicht geschrieben wurde. Und einer, der ein Signal schreibt, das er selbst
liest, läuft im Kreis.
Die Faustregel: Was sich errechnen lässt, wird nicht gespeichert. Effekte bleiben für das, was aus Angular hinausführt — Protokollierung, fremde Bibliotheken, der Zugriff aufs DOM.
Mehr dazu im Seminar
Wie signal(), computed(), linkedSignal() und effect() zusammenspielen —
und wann welches davon das richtige ist — zeigt das Modul
Signals: Zustand modellieren
aus dem Seminar
Angular für erfahrene Entwickler,
inklusive Video und Kapitelübersicht. Die Kurzform zum Danebenlegen steht im
Angular 22 — Kern Cheat Sheet.