Hallo Bert,
nein, das ist nicht hacky, das ist genau richtig so. Aber du brauchst keine globalen Variablen.
setTimeout(MakrotaskScheduler,
0,
[Func1, Func2, Func3, Func4, Func5, ...]);
function MakrotaskScheduler(actions) {
let action = actions.shift();
if (action) action();
if (actions.length > 0)
setTimeout(MakrotaskScheduler, 0, actions);
}
Ich schreibe die Funktion bei sowas gern separat, dann ist der setTimeout-Aufruf übersichtlicher.
Die Parameter 3ff von setTimeout werden an die aufgerufene Funktion weitergereicht. Die shift Methode nimmt das erste Element aus dem Array heraus. Auf diese Weise wird das Array immer eins kleiner und die Actions werden durchgeführt. Jede einzelne Aktion findet in einem Makrotask statt.
Das sieht rekursiv aus, ist es aber nicht, weil setTimeout nicht den Aufruf durchführt. Es hinterlegt nur den Aufruf in der Makrotask-Queue, den Aufruf selbst führt die JavaScript Runtime auf einem leeren Stack durch.
Ob setTimeout richtig ist oder requestAnimationFrame, hängt davon ab, was Du eigentlich tun willst. Glatte Animationen gehen präziser mit letzterem.
Rolf
--
sumpsi - posui - obstruxi