node.js中的定時器nextTick()和setImmediate()區(qū)別分析
1.node中使用定時器的問題在于,它并非精確的.譬如setTimeout()設(shè)定一個任務(wù)在10ms后執(zhí)行,但是在9ms后,有一個任務(wù)占用了5ms,再次輪到定時器時,已經(jīng)耽誤了4ms.
好了node中的定時器就簡單的講這么多.
2.看代碼:
process.nextTick(function(){
console.log("延遲執(zhí)行");
});
console.log("正常執(zhí)行1");
console.log("正常執(zhí)行2");
console.log("正常執(zhí)行3");
console.log("正常執(zhí)行4");

通過這個例子,我想大家很清楚的就能看到nextTick()是用來干嘛的了.主要是用來異步執(zhí)行的.
在看代碼:
setImmediate(function(){
console.log("延遲執(zhí)行");
});
console.log("正常執(zhí)行");

我們發(fā)現(xiàn)setImmediate也是異步執(zhí)行的.奇怪了
那么它與nextTick()有什么區(qū)別呢?
看代碼:
代碼一:
process.nextTick(function(){
console.log("nextTick延遲")
});
setImmediate(function(){
console.log("setImmediate延遲");
});
console.log("正常執(zhí)行");
結(jié)果:

代碼二:
setImmediate(function(){
console.log("setImmediate延遲");
});
process.nextTick(function(){
console.log("nextTick延遲")
});
console.log("正常執(zhí)行");
結(jié)果:

發(fā)現(xiàn)代碼雖然順序不一樣,但是執(zhí)行的結(jié)果是一樣的.
從結(jié)果可以發(fā)現(xiàn):
nextTick()的回調(diào)函數(shù)執(zhí)行的優(yōu)先級要高于setImmediate();
process.nextTick()屬于idle觀察者,setImmediate()屬于check觀察者.在每一輪循環(huán)檢查中,idle觀察者先于I/O觀察者,I/O觀察者先于check觀察者.
在具體實現(xiàn)上,process.nextTick()的回調(diào)函數(shù)保存在一個數(shù)組中,
setImmediate()的結(jié)果則是保存在鏈表中.
在行為上,process.nextTick()在每輪循環(huán)中會將數(shù)組中的回調(diào)函數(shù)全部執(zhí)行完.
而setImmediate()在每輪循環(huán)中執(zhí)行鏈表中的一個回調(diào)函數(shù).
//加入2個nextTick()的回調(diào)函數(shù)
process.nextTick(function(){
console.log("nextTick延遲執(zhí)行1");
});
process.nextTick(function(){
console.log("nextTick延遲執(zhí)行2");
});
//加入兩個setImmediate()回調(diào)函數(shù)
setImmediate(function(){
console.log("setImmediate延遲執(zhí)行1");
process.nextTick(function(){
console.log("強勢插入");
});
});
setImmediate(function(){
console.log("setImmediate延遲執(zhí)行2");
});
console.log("正常執(zhí)行");

從執(zhí)行結(jié)果上看出:當?shù)谝粋€setImmediate()的回調(diào)函數(shù)執(zhí)行完后,并沒有立即執(zhí)行第二個,而是進入了下一輪循環(huán),再次按nextTick()優(yōu)先,setImmediate()次后的順序執(zhí)行.之所以這樣設(shè)計,是為了保證每次循環(huán)能夠較快的執(zhí)行結(jié)束.防止CPU占用過多而阻塞后續(xù)I/O調(diào)用的情況.
以上就是相關(guān)node.js中的定時器nextTick()和setImmediate()區(qū)別的資料了,小伙伴們是否清楚了他們之間的區(qū)別了呢?
相關(guān)文章
Node.js net模塊功能及事件監(jiān)聽用法分析
這篇文章主要介紹了Node.js net模塊功能及事件監(jiān)聽用法,結(jié)合實例形式分析了net模塊功能及事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
Node.js實現(xiàn)前端后端數(shù)據(jù)傳輸加密解密
這篇文章主要介紹了Node.js實現(xiàn)前端后端數(shù)據(jù)傳輸加密解密,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法
這篇文章主要介紹了Node.js 實現(xiàn)簡單的無侵入式緩存框架的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Node.js 使用axios讀寫influxDB的方法示例
這篇文章主要介紹了Node.js 使用axios讀寫influxDB的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
基于 Node 實現(xiàn)簡易 serve靜態(tài)資源服務(wù)器的示例詳解
靜態(tài)資源服務(wù)器(HTTP 服務(wù)器)可以將靜態(tài)文件(如 js、css、圖片)等通過 HTTP 協(xié)議展現(xiàn)給客戶端。本文介紹如何基于 Node 實現(xiàn)一個簡易的靜態(tài)資源服務(wù)器,感興趣的朋友一起看看吧2022-06-06

