宏任务与微任务输出顺序练习题
文章目录一.宏任务与微任务输出顺序练习题第一题第二题第三题第四题第五题一.宏任务与微任务输出顺序练习题第一题asyncfunctionfn(){console.log(fn start);awaitPromise.resolve();console.log(fn end);}console.log(script start);fn();setTimeout((){console.log(setTimeout);},0);console.log(script end);我的回答:script start,fn start,fn end,script end,setTimeout参考答案script start → fn start →script end → fn end→ setTimeout注:async函数在调用时,先执行里面的同步部分,直到遇到await,会把后续代码放入微任务队列(fn end),因此后续的同步代码(‘script end’)会先执行第二题console.log(a);setImmediate((){console.log(setImmediate1);});setTimeout((){console.log(setTimeout1);},0);Promise.resolve().then((){console.log(then1);setImmediate((){console.log(setImmediate2);});});console.log(b);我的回答:a b setImmediate1 then1 setImmediate2 setTimeout1参考答案a → b →then1 → setTimeout1 → setImmediate1 → setImmediate2注:1.微任务(then1)所有宏任务(setImmediate和setTimeout)2.宏任务队列中setTimeout0ms优先级高于 setImmediate第三题asyncfunctionasync1(){awaitasync2();console.log(async1 end);}asyncfunctionasync2(){console.log(async2);returnPromise.resolve(async2 resolve);}console.log(script start);async1();setTimeout((){console.log(setTimeout);},0);Promise.resolve().then((){console.log(promise then);});console.log(script end);我的回答:script start,async2,async1 end,script end,promise then,async2 resolve,setTimeout参考答案script start → async2 →script end → async1 end → promise then→ setTimeout注:’async2 resolve’不会输出,没有then输出过程:同步代码:script start → async2 → script end 其中,’async2’的输出过程是这样的:调用async1()进入async1函数执行awaitasync2()同步调用async2函数进入async2函数输出’async2’微任务:async1endpromise then宏任务:setTimeout第四题console.log(1);setTimeout((){console.log(2);},100);setTimeout((){console.log(3);},0);Promise.resolve().then((){console.log(4);});console.log(5);输出顺序:1 5 4 2 3参考答案1 → 5 → 4 → 3 → 2注:setTimeout0ms比 setTimeout100ms先执行第五题process.nextTick((){console.log(nextTick1);});console.log(start);setTimeout((){console.log(setTimeout);process.nextTick((){console.log(nextTick2);});},0);Promise.resolve().then((){console.log(promise);});process.nextTick((){console.log(nextTick3);});console.log(end);输出顺序:start,end,nextTick1,nextTick3,promise,setTimeout,nextTick2注:process.nextTick微任务优先级高于Promise.then宏任务内部的process.nextTick在当前宏任务执行后立即执行