Lepiej jest pisać kod, który nie opiera się na czasie natychmiastowych wywołań zwrotnych (takich jak mikroprocesory kontra makrotaskania), ale odłóżmy to na chwilę na bok.
setTimeout
ustawia w kolejce makrotask, który co najmniej czeka, aż rozpocznie się, aż wszystkie mikroprobówki (i mikroprobówki, które spawnują) zakończą się. Oto przykład:
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');
Zachowanie się .then
na rozwiązanej obietnicy zasadniczo różni się od zachowania natychmiastowego setTimeout
wywołania zwrotnego - obietnica .then
zostanie uruchomiona jako pierwsza, nawet jeśli setTimeout
pierwsza była w kolejce. Ale tylko nowoczesne przeglądarki obsługują obietnice. Jak można właściwie wypełnić specjalną funkcjonalność mikroprobówki, jeśli Promise
nie istnieje?
Jeśli spróbujesz naśladować .then
mikroprocesor za pomocą setTimeout
, będziesz ustawiać w kolejce makrotask, a nie mikroprobówkę, więc źle wypełnione pole .then
nie uruchomi się we właściwym czasie, jeśli makrotask jest już w kolejce.
Jest takie rozwiązanie MutationObserver
, ale wygląda brzydko i nie MutationObserver
jest po co . Ponadto MutationObserver
nie jest obsługiwany w IE10 i wcześniejszych wersjach. Jeśli ktoś chce umieścić w kolejce mikroprobówkę w środowisku, które natywnie nie obsługuje Obietnic, czy są jakieś lepsze alternatywy?
(Nie jestem faktycznie stara się wspierać IE10 - to tylko teoretyczne ćwiczenia na jak microtasks można kolejce bez Promises)
schedule.js
będzie pouczające.