即時のコールバックのタイミングに依存しないコード(マイクロタスクとマクロタスクのような)を書く方が良いですが、とりあえず脇に置いておきましょう。
setTimeout
マクロタスクをキューに入れます。マクロタスクは、少なくとも、すべてのマイクロタスク(およびそれらが生成するマイクロタスク)が完了するまで開始を待機します。次に例を示します。
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');
行動.then
解決の約束には、即時の行動は基本的に異なるsetTimeout
コールバック-約束は.then
しても、最初に実行されるsetTimeout
最初のキューに入れられました。ただし、Promiseをサポートしているのは最新のブラウザのみです。どのようにすることができ、特別な場合にはマイクロタスクの機能が適切にpolyfilledことPromise
は存在しないのですか?
.then
を使用してのマイクロsetTimeout
タスクを模倣しようとすると、マイクロタスクではなくマクロタスクがキューイングされるため、.then
マクロタスクがすでにキューに登録されている場合、不適切にポリフィルされたものが適切なタイミングで実行されません。
を使用した解決策がありますMutationObserver
が、見た目が醜く、それMutationObserver
が目的ではありません。また、MutationObserver
IE10以前ではサポートされていません。Promiseをネイティブでサポートしていない環境でマイクロタスクをキューに入れたい場合、より良い代替手段はありますか?
(私は実際にはIE10をサポートしようとしているわけではありません。これは、Promiseなしでマイクロタスクをキューに入れる方法についての理論的な演習です)
schedule.js
見てみると啓発されます。