javascript / expert
Snippet
Generatorbasierte Fiber-Work-Loop-Ablaufsteuerung
Dieses Fortgeschrittenen-React-Snippet implementiert eine zeitaufgeteilte Arbeits-Schleife mithilfe von ES6-Generator-Funktionen und requestIdleCallback. Durch die Übergabe der Kontrolle an diskreten Einheitsgrenzen wird verhindert, dass langlaufende synchrone Zustandsberechnungen den Haupt-Thread blockieren, ähnlich dem React-Fiber-Scheduling.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import React, { useEffect, useRef, useState } from 'react';function* createWorkLoop(units) {for (let i = 0; i < units.length; i++) {yield units[i]();}}export function FiberScheduler({ tasks }) {const [completed, setCompleted] = useState([]);const generatorRef = useRef(null);useEffect(() => {generatorRef.current = createWorkLoop(tasks);let frameId;const step = (deadline) => {let work = generatorRef.current?.next();while (work && !work.done && deadline.timeRemaining() > 0) {if (work.value) setCompleted((prev) => [...prev, work.value]);work = generatorRef.current.next();}if (work && !work.done) {frameId = requestIdleCallback(step);}}; globalThis.requestIdleCallback ? (frameId = requestIdleCallback(step)) : step({ timeRemaining: () => 1 });return () => cancelIdleCallback?.(frameId);}, [tasks]);return <div>Completed units: {completed.length}</div>;}
react
Erklärung
1
function* createWorkLoop(units) {
Definiert eine Generator-Funktion, um Arbeitsschritte schrittweise zu durchlaufen.
2
let work = generatorRef.current?.next();
Führt den Generator um eine Einzeleinheit weiter aus, bis die Frist abläuft.
3
while (work && !work.done && deadline.timeRemaining() > 0) {
Führt Aufgaben kontinuierlich nur aus, solange das Frame-Zeitbudget ausreicht.