Rolf B: scrollIntoView() geht mit Firefox/IE, aber nicht mit Chrome

Beitrag lesen

Hallo dedlfix,

Bei einem sofort erfüllten Promise wird wohl auch ein direkt danach ausgeführtes then() sofort ausgeführt werden

Das habe ich auch mal geglaubt, aber es stimmt nicht. Der then-Callback ist immer asynchron und wird als Microtask ausgeführt (d.h. sobald der JavaScript-Stack leer ist - das ist nicht das gleiche wie „fertig mit dem aktuellen Event“). Das ist auch gut so, denn andernfalls wäre die Ausführungsreihenfolge deines Codes ggf. vom Timing des Promise-Callback abhängig, und das wäre ganz schwer zu testen.

Hast Du den verlinkten Blog-Beitrag von Jake Archibald angeschaut? Da ist ein sehr schönes Beispiel (abgesehen von der Tatsache dass er ein div click-able macht).

Kleineres Beispiel:

function logValue(v) { console.log("logging " + v); }

console.log("Promise 1");
Promise.resolve(1).then(logValue);

console.log("Promise 2");
new Promise((good,bad) => 
      good(2))
.then(logValue);

console.log("Promise 3");
new Promise((good,bad) => 
     setTimeout(() => { logValue(3000); good(3); }, 1000) )
.then(logValue);

console.log("Fertig!");

Die Ausgabe in einem Spec-konformen Browser ist:

Promise 1, Promise 2, Promise 3, Fertig!, logging1, logging 2, (kurze Pause), logging 3000, logging 3

Einige ältere Browser sind nicht Spec-konform, die machen das ggf. nicht richtig. Jake Archibald hat in seinem Blog Chrome, FF, Safari und Edge verglichen, und alle außer Chrome waren falsch. Der Blog ist aber schon 2 Jahre alt, die heutigen Versionen von FF und Edge machen es richtig (gestern Abend getestet). Safari habe ich nicht da.

Rolf

--
sumpsi - posui - clusi