Es ist besser, Code zu schreiben, der nicht vom Zeitpunkt sofortiger Rückrufe abhängt (wie Mikrotasks oder Makrotasks), aber lassen Sie uns dies für den Moment beiseite legen.
setTimeout
Stellt eine Makrotask in die Warteschlange, die mindestens auf den Start wartet, bis alle Mikrotasks (und die von ihnen erzeugten Mikrotasks) abgeschlossen sind. Hier ist ein Beispiel:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
Das Verhalten .then
eines aufgelösten Versprechens unterscheidet sich grundlegend vom Verhalten eines sofortigen setTimeout
Rückrufs - das Versprechen .then
wird zuerst ausgeführt, selbst wenn das zuerst setTimeout
in die Warteschlange gestellt wurde. Aber nur moderne Browser unterstützen Versprechen. Wie kann die spezielle Funktionalität einer Mikrotask ordnungsgemäß polygefüllt werden, wenn Promise
sie nicht vorhanden ist?
Wenn Sie versuchen, die .then
Mikrotask eines Benutzers mithilfe von zu imitieren setTimeout
, stellen Sie eine Makrotask in die Warteschlange, keine Mikrotask, sodass die schlecht gefüllte Mikrotask .then
nicht zum richtigen Zeitpunkt ausgeführt wird, wenn eine Makrotask bereits in der Warteschlange steht.
Es gibt eine Lösung MutationObserver
, aber sie sieht hässlich aus und ist nicht das, wofür sie gedacht MutationObserver
ist. Wird MutationObserver
auch von IE10 und früheren Versionen nicht unterstützt. Wenn man eine Mikrotask in einer Umgebung in die Warteschlange stellen möchte, die Promises nicht nativ unterstützt, gibt es bessere Alternativen?
(Ich versuche eigentlich nicht , IE10 zu unterstützen - dies ist nur eine theoretische Übung darüber, wie Mikrotasks ohne Versprechen in die Warteschlange gestellt werden können.)
schedule.js
wird aufschlussreich sein.