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.
setTimeoutustawia 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ę .thenna rozwiązanej obietnicy zasadniczo różni się od zachowania natychmiastowego setTimeoutwywołania zwrotnego - obietnica .thenzostanie uruchomiona jako pierwsza, nawet jeśli setTimeoutpierwsza 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 Promisenie istnieje?
Jeśli spróbujesz naśladować .thenmikroprocesor za pomocą setTimeout, będziesz ustawiać w kolejce makrotask, a nie mikroprobówkę, więc źle wypełnione pole .thennie 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 MutationObserverjest po co . Ponadto MutationObservernie 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.jsbędzie pouczające.