Der Click-Handler läuft als eine einzige Task komplett durch. Danach wird die Microtask-Queue geleert, inklusive aufgelöster Promise-Callbacks, bevor sonst irgendetwas passiert. Erst dann, und nur wenn ein Frame fällig ist, führt der Browser die requestAnimationFrame-Callbacks aus und geht durch Style, Layout, Paint und Composite. Eine lange Task oder eine endlose Kette von Microtasks verzögert diesen Frame, und Nutzer lesen die Verzögerung als Ruckeln.
Warum Interviewer das fragen
Fast die gesamte Frontend-Performance-Arbeit läuft darauf hinaus, zu wissen, was den Frame blockiert. Der Interviewer will hören, dass Scripting, Style, Layout und Paint sich einen Main Thread teilen, dass Microtasks kein Weg sind, die Kontrolle an den Browser zurückzugeben, und dass es requestAnimationFrame für Arbeit gibt, die vor dem Paint landen muss. Außerdem sagt es voraus, ob du eine Beschwerde über mangelnde Reaktionsfähigkeit debuggen kannst oder einfach setTimeout-Aufrufe verteilst, bis das Symptom woanders auftaucht.
So baust du deine Antwort auf
- Nenn die drei Phasen in der richtigen Reihenfolge: Task, Leeren der Microtasks, Rendering-Gelegenheit.
- Weise darauf hin, dass Microtasks den Renderer aushungern, ein Timeout dagegen abgibt.
- Sag, wo requestAnimationFrame relativ zu Style und Layout sitzt.
- Verbinde es mit einer Metrik wie der Interaktionslatenz.
Beispielantwort
Der Handler selbst ist eine Task auf dem Main Thread, er läuft also von Anfang bis Ende durch, ohne dass ihn etwas unterbricht. Sobald er zurückkehrt, leert der Browser die Microtask-Queue, jede await-Fortsetzung und jeder then-Callback eines Promise läuft also genau dort, und wenn die immer weitere Microtasks einreihen, kommt der Browser nie zum Painten. Ist die Queue leer, und nur wenn tatsächlich ein Frame fällig ist, führt der Browser die requestAnimationFrame-Callbacks aus und geht dann durch Style-Recalc, Layout, Paint und Composite. Deshalb behandle ich lange Tasks als den eigentlichen Feind. Auf einem Dashboard, an dem ich gearbeitet habe, hat ein Filterwechsel im Handler synchron rund vierzigtausend Zeilen sortiert, und der Klick fühlte sich für etwa zweihundert Millisekunden tot an. Es so aufzuteilen, dass der Handler nur noch das Eingabefeld aktualisiert und dann mit scheduler.yield abgibt, bevor der teure Durchlauf startet, hat das Frame-Budget intakt gelassen, und die Interaktion hat sofort reagiert, obwohl die Gesamtarbeit identisch war.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Warum bekommt der Browser keine Gelegenheit zu painten, wenn du auf ein bereits aufgelöstes Promise wartest?
- Wann würdest du zu requestAnimationFrame statt zu einem Timeout greifen?
- Wie würdest du eine lange Task aufteilen, ohne das Ergebnis zu verändern?
Weitere Fragen für Frontend-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen