1. 程式人生 > >Node定時器詳解----深入node

Node定時器詳解----深入node

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.微任務