Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別
一、Webstrom使用node.jsIDE的問題
在區(qū)別這兩個函數(shù)之前來說一下Webstrom使用node.jsIDE的問題,在配置Node.js的IDE了,但setImmediate()、require等這些node.js中內(nèi)置的函數(shù)時并不會有提示,要解決這個問題只要設(shè)置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled設(shè)為Enable.
二、兩者的區(qū)別
1.在理解兩者的區(qū)別之前要說一下輪詢
前面博客也有記錄,nodejs中是事件驅(qū)動的,有一個循環(huán)線程一直從事件隊列中取任務(wù)執(zhí)行或者I/O的操作轉(zhuǎn)給后臺線程池來操作,把這個循環(huán)線程的每次執(zhí)行的過程算是一次輪詢.
2.setImmediate()的使用
即時計時器立即執(zhí)行工作,它是在事件輪詢之后執(zhí)行,為了防止輪詢阻塞,每次只會調(diào)用一個。
3.Process.nextTick()的使用
它和setImmediate()執(zhí)行的順序不一樣,它是在事件輪詢之前執(zhí)行,為了防止I/O饑餓,所以有一個默認(rèn)process.maxTickDepth=1000來限制事件隊列的每次循環(huán)可執(zhí)行的nextTick()事件的數(shù)目。
4.總結(jié)
在網(wǎng)上百度的關(guān)于它們的總結(jié):
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ù).
5.代碼demo
//加入2個nextTick()的回調(diào)函數(shù) process.nextTick(function(){ console.log("nextTick延遲執(zhí)行A"); }); process.nextTick(function(){ console.log("nextTick延遲執(zhí)行B"); setImmediate(function(){ console.log("setImmediate延遲執(zhí)行C"); }); process.nextTick(function(){ console.log("nextTick延遲執(zhí)行D"); }); }); //加入兩個setImmediate()回調(diào)函數(shù) setImmediate(function(){ console.log("setImmediate延遲執(zhí)行E"); process.nextTick(function(){ console.log("強(qiáng)勢插入F"); }); setImmediate(function(){ console.log("setImmediate延遲執(zhí)行G"); }); }); setImmediate(function(){ console.log("setImmediate延遲執(zhí)行H"); process.nextTick(function(){ console.log("強(qiáng)勢插入I"); }); process.nextTick(function(){ console.log("強(qiáng)勢插入J"); }); setImmediate(function(){ console.log("setImmediate延遲執(zhí)行K"); }); }); console.log("正常執(zhí)行L");
輸出結(jié)果:
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Immediate.js
正常執(zhí)行L
nextTick延遲執(zhí)行A
nextTick延遲執(zhí)行B
nextTick延遲執(zhí)行D
setImmediate延遲執(zhí)行E
setImmediate延遲執(zhí)行H
setImmediate延遲執(zhí)行C
強(qiáng)勢插入F
強(qiáng)勢插入I
強(qiáng)勢插入J
setImmediate延遲執(zhí)行G
setImmediate延遲執(zhí)行KProcess finished with exit code 0
關(guān)于執(zhí)行順序的問題很不容易搞明白,說實話現(xiàn)在我對它還是不是太理解,希望有大神能給講明白。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MQTT Client實現(xiàn)消息推送功能的方法詳解
這篇文章主要介紹了MQTT Client實現(xiàn)消息推送功能的方法,結(jié)合實例形式詳細(xì)分析了MQTT Client實現(xiàn)消息推送的基本原理、實現(xiàn)方法與相關(guān)操作注意事項,需要的朋友可以參考下2023-05-05基于node搭建服務(wù)器,寫接口,調(diào)接口,跨域的實例
今天小編就為大家分享一篇基于node搭建服務(wù)器,寫接口,調(diào)接口,跨域的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Win7系統(tǒng)中如何安裝高版本的NodeJS(親測有效!)
Node.js是基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境,能夠使JavaScript在服務(wù)器端運(yùn)行,這篇文章主要給大家介紹了關(guān)于Win7系統(tǒng)中如何安裝高版本的NodeJS的相關(guān)資料,需要的朋友可以參考下2023-12-12Node中文件斷點(diǎn)續(xù)傳原理和方法總結(jié)
在之前做過一個小項目,涉及到了文件上傳,在大文件上面使用了斷點(diǎn)續(xù)傳,降低了服務(wù)器方面的壓力,現(xiàn)在小編把Node中文件斷點(diǎn)續(xù)傳原理和方法總結(jié)分享給大家,感興趣的朋友一起看看吧2022-01-01Node.js中的events事件模塊知識點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于Node.js中的events事件模塊知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12