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.)
quelle
schedule.js
wird aufschlussreich sein.Antworten:
Wenn wir über IE sprechen, können Sie verwenden
setImmediate
https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate
setImmediate
wird auf IE10 unterstützt. Also plus eine IE-Version.Und wenn Sie interessiert sind, plus Node.js.
Es gibt andere mögliche Polyfills. Hier einige Implementierungen: https://github.com/YuzuJS/setImmediate/blob/master/setImmediate.js (diese wird in MDN erwähnt) https://github.com/taylorhakes/ setAsap / blob / master / setAsap.js (einfacher)
Und wie fast alle Polyfills sind sie auch hässlich.
Aber hier ist ein Beispiel in seiner Essenz (mit postMessage), und ich denke, es ist am wenigsten hässlich von allen (aber auch keine echte Polyfüllung)
quelle
Ich habe gesehen, dass
mutationObserver
Rückrufe Mikrotasks verwenden, und zum Glück unterstützt IE11 diese. Daher kam mir die Idee, eine Mikrotask in IE11 in die Warteschlange zu stellen, indem der Rückruf gespeichert und der Beobachter dann sofort durch Ändern eines Elements ausgelöst wird:Sie können IE11 öffnen und sehen, dass das oben genannte funktioniert, aber der Code sieht seltsam aus.
quelle