[JavaScript]Marotask QueとMicrotask Que

1936 ワード

setImmediate(function(){
    console.log(1);
},0);
setTimeout(function(){
    console.log(2);
},0);
new Promise(function(resolve){
    console.log(3);
    resolve();
    console.log(4);
}).then(function(){
    console.log(5);
});
console.log(6);
process.nextTick(function(){
    console.log(7);
});
console.log(8);
   :3 4 6 8 7 5 2 1
イベントの登録手順は以下の通りです.
setImmediate - setTimeout - promise.then - process.nextTick
したがって、優先関係は以下の通りである.
process.nextTick > promise.then > setTimeout > setImmediate
理由は以下の通りです.
Promise/A+規範は指摘しています:Here“pltform code”means engine,environment,and promise implementaation code.In practice,thisrequeement ensurererethththat on FFurfiled and on Rejecteeeeexxxxteteteststststinininininininininthththththththththththththththththththasasasasasinininininininininininininththththththththththththththththththththrorororororoinininininininininininininininininininininskmechaism such as setTimeout or setImmedite,or with a「micro-task」mechanim such as MuttionObserver.process.nextTick.Since the promiplement pleform code,may thelselcondunet
V 8実装では、2つの列はそれぞれ異なるタスクを含む:
macrotasks: script(    ),setTimeout, setInterval, setImmediate, I/O, UI rendering
microtasks: process.nextTick, Promises, Object.observe, MutationObserver
実行過程は以下の通りです.JavaScriptエンジンはまずmacrotask queueから第一の任務を取り出して、実行が終わったら、microtask queueの中のすべての任務を取り出して、順番に全部実行します.そしてもう一つをmacrotask queueから取って、実行が終わったら、再度microtask queueの中の全部を取り出します.二つのqueueの中の任務が全部終わるまで往復します.
コードの実行開始時に、これらのコードは全部macrotask queueから取り出して実行します.後にsetTimeoutに会って、またmacrotask queueに参加しました.そして、promise.thenに出会いました.もう一つの列に入れました.など、execution context stack全体を実行した後、次のステップはmicrotask queueの中のタスクです.したがって、promise.thenのコールバックはsetTimeoutより先に実行される.
参照
8.1.4 Event loops-Perform a microtask checkpoint