一、Webstrom使用node.js IDE的問題
在區別這兩個函數之前來說一下Webstrom使用node.js IDE的問題,在配置Node.js的IDE了,但setImmediate()、require等這些node.js中內置的函數時並不會有提示,要解決這個問題只要設置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled設為Enable.
二、兩者的區別
1.在理解兩者的區別之前要說一下輪詢
前面博客也有記錄,nodejs中是事件驅動的,有一個循環線程一直從事件隊列中取任務執行或者I/O的操作轉給后台線程池來操作,把這個循環線程的每次執行的過程算是一次輪詢.
2.setImmediate()的使用
即時計時器立即執行工作,它是在事件輪詢之后執行,為了防止輪詢阻塞,每次只會調用一個。
3.Process.nextTick()的使用
它和setImmediate()執行的順序不一樣,它是在事件輪詢之前執行,為了防止I/O飢餓,所以有一個默認process.maxTickDepth=1000來限制事件隊列的每次循環可執行的nextTick()事件的數目。
4.總結
在網上百度的關於它們的總結:
nextTick()的回調函數執行的優先級要高於setImmediate();
process.nextTick()屬於idle觀察者,setImmediate()屬於check觀察者.在每一輪循環檢查中,idle觀察者先於I/O觀察者,I/O觀察者先於check觀察者.
在具體實現上,process.nextTick()的回調函數保存在一個數組中,
setImmediate()的結果則是保存在鏈表中.
在行為上,process.nextTick()在每輪循環中會將數組中的回調函數全部執行完.
而setImmediate()在每輪循環中執行鏈表中的一個回調函數.
5.代碼demo
//加入2個nextTick()的回調函數 process.nextTick(function(){ console.log("nextTick延遲執行A"); }); process.nextTick(function(){ console.log("nextTick延遲執行B"); setImmediate(function(){ console.log("setImmediate延遲執行C"); }); process.nextTick(function(){ console.log("nextTick延遲執行D"); }); }); //加入兩個setImmediate()回調函數 setImmediate(function(){ console.log("setImmediate延遲執行E"); process.nextTick(function(){ console.log("強勢插入F"); }); setImmediate(function(){ console.log("setImmediate延遲執行G"); }); }); setImmediate(function(){ console.log("setImmediate延遲執行H"); process.nextTick(function(){ console.log("強勢插入I"); }); process.nextTick(function(){ console.log("強勢插入J"); }); setImmediate(function(){ console.log("setImmediate延遲執行K"); }); }); console.log("正常執行L");
輸出結果:
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Immediate.js 正常執行L nextTick延遲執行A nextTick延遲執行B nextTick延遲執行D setImmediate延遲執行E setImmediate延遲執行H setImmediate延遲執行C 強勢插入F 強勢插入I 強勢插入J setImmediate延遲執行G setImmediate延遲執行K Process finished with exit code 0
關於執行順序的問題很不容易搞明白,說實話現在我對它還是不是太理解,希望有大神能給講明白。