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.
setTimeoutStellt 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 .theneines aufgelösten Versprechens unterscheidet sich grundlegend vom Verhalten eines sofortigen setTimeoutRückrufs - das Versprechen .thenwird zuerst ausgeführt, selbst wenn das zuerst setTimeoutin die Warteschlange gestellt wurde. Aber nur moderne Browser unterstützen Versprechen. Wie kann die spezielle Funktionalität einer Mikrotask ordnungsgemäß polygefüllt werden, wenn Promisesie nicht vorhanden ist?
Wenn Sie versuchen, die .thenMikrotask eines Benutzers mithilfe von zu imitieren setTimeout, stellen Sie eine Makrotask in die Warteschlange, keine Mikrotask, sodass die schlecht gefüllte Mikrotask .thennicht 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 MutationObserverist. Wird MutationObserverauch 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.jswird aufschlussreich sein.