Node定時器詳解----深入node
阿新 • • 發佈:2019-01-26
javascript是單執行緒執行,非同步操作特別重要
libuv庫可以與核心對話
node提供四個定時器,讓任務可以在指定的時間執行
- setTimeout()
- setInterval()
- setImmediate()
- process.nextTick()
你能說出下面程式碼的執行結果嗎?
setTimeout(()=>console.log(1));
setImmediate(()=>console.log(2));
process.nextTick(()=>console.log(3));
Promise.resolve().then(()=>console .log(4));
(()=>console.log(5))();
執行結果如下:
5
3
4
1
2
libuv庫怎麼安排非同步任務在主執行緒上執行
1.同步任務總是必比非同步任務更早執行
(()=>console.log(5))();最先執行
2.本輪迴圈和次輪迴圈
非同步任務可以分為兩種:
- 追加在本輪迴圈的非同步任務
- 追加在次輪迴圈的非同步任務
事件迴圈是javascript 引擎處理非同步任務的方式
node規定,process.nextTick和Promise的回撥函式,追加在本輪迴圈,即同步任務一旦執行完成,就開始執行它們。而setTineout,setInterval,setImmediate的回撥函式,追加在此輪迴圈
nextTickQueue
process.nextTick是在本輪迴圈執行的,而且是所有非同步任務最快執行的
Node執行完所有同步任務,接下來就會執行process.nextTick的任務佇列
基本上,如果你希望非同步任務儘快的執行,那就使用process.nextTick
微任務(microtask)
微任務是追加在process.nextTick對列的後面也屬於本輪迴圈
ps:只有前一個佇列全部清空,才會執行下一個佇列
process.nextTick(()=>console.log(1));
Promise.resolve().then(()=>console .log(2))
process.nextTick(()=>console.log(3));
Promise.resolve().then(()=>console.log(4))
//1
//3
//2
//4
上面程式碼中,全部process.nextTick的回撥函式,執行都會在於Promise的
至此,本輪迴圈的執行順序就講完了
1.同步任務
2.process.nextTick()
3.微任務