Node.js中Process.nextTick()和setImmediate()的區別

1、Webstrom使用node.js IDE的問題node

在區別這兩個函數以前來講一下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.數組

2、二者的區別函數

1.在理解二者的區別以前要說一下輪詢ui

前面博客也有記錄,nodejs中是事件驅動的,有一個循環線程一直從事件隊列中取任務執行或者I/O的操做轉給後臺線程池來操做,把這個循環線程的每次執行的過程算是一次輪詢.spa

2.setImmediate()的使用線程

即時計時器當即執行工做,它是在事件輪詢以後執行,爲了防止輪詢阻塞,每次只會調用一個。3d

3.Process.nextTick()的使用code

它和setImmediate()執行的順序不同,它是在事件輪詢以前執行,爲了防止I/O飢餓,因此有一個默認process.maxTickDepth=1000來限制事件隊列的每次循環可執行的nextTick()事件的數目。orm

4.總結blog

在網上百度的關於它們的總結:

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

 關於執行順序的問題很不容易搞明白,說實話如今我對它仍是不是太理解,但願有大神能給講明白。

相關文章
相關標籤/搜索