记了老是忘记那就写下来吧宏任务微任务
宏任務(wù):script 定時(shí)器 微任務(wù):promiss process.nexttick
new Promise(function(resolve){console.log(3);//此為同步程序resolve();//同步 是否異步 由內(nèi)部函數(shù)決定console.log(4); }).then(function(){ //。then 異步console.log(5); });async function async1() {console.log("async1 start");//同步await async2();//同步 是否異步 由內(nèi)部函數(shù)決定console.log("async1 end");//異步開始}process.nextTick 永遠(yuǎn)大于 promise.then
知乎練習(xí)題
setTimeout(function () {console.log(4) }, 0); new Promise(function (resolve) {console.log(1);for (var i = 0; i < 10000; i++) {i == 9999 && resolve()}console.log(2) }).then(function () {console.log(5) }); console.log(3);// 1 3 2 5 4 錯(cuò)誤 // 12354 ? // 由于整個(gè) script 也屬于一個(gè) macrotask, 由于會先執(zhí)行 macrotask 中的第一個(gè)任務(wù), 再加上promise 構(gòu)造函數(shù)因?yàn)槭峭降?#xff0c;所以會先打印出 1和2然后繼續(xù)同步執(zhí)行末尾的 console.log(3) 打印出3 此時(shí) setTimeout 被推進(jìn)到 macrotask 隊(duì)列中,promise.then 回調(diào)被推進(jìn)到 microtask 隊(duì)列中由于在第一步中已經(jīng)執(zhí)行完了第一個(gè) macrotask , 所以接下來會順序執(zhí)行所有的 microtask, 也就是 promise.then 的回調(diào)函數(shù) ,從而打印出5microtask 隊(duì)列中的任務(wù)已經(jīng)執(zhí)行完畢,繼續(xù)執(zhí)行剩下的 macrotask 隊(duì)列中 的任務(wù),也就是 setTimeout, 所以打印出 4
“剩下的疑問: process.nextTick也會放入microtask quque,為什么優(yōu)先級比promise.then高呢? 到底是不是setTimeout有一個(gè)依賴實(shí)現(xiàn)的最小延遲?4ms?”
process.nextTick 永遠(yuǎn)大于 promise.then,原因其實(shí)很簡單。。。在Node中,_tickCallback在每一次執(zhí)行完TaskQueue中的一個(gè)任務(wù)后被調(diào)用,而這個(gè)_tickCallback中實(shí)質(zhì)上干了兩件事: 1. nextTickQueue中所有任務(wù)執(zhí)行掉(長度最大1e4,Node版本v6.9.1) 2. 第一步執(zhí)行完后執(zhí)行_runMicrotasks函數(shù),執(zhí)行microtask中的部分(promise.then注冊的回調(diào)) 所以很明顯process.nextTick > promise.then
轉(zhuǎn)載于:https://www.cnblogs.com/smzd/p/8482278.html
總結(jié)
以上是生活随笔為你收集整理的记了老是忘记那就写下来吧宏任务微任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go爬虫和python爬虫哪个好_pyt
- 下一篇: 单行溢出 和多行溢出