2015-03-03 115 views
0

我在學習Node.js,並且很難理解setImmediate()和process.nextTick()的工作。爲了理解清楚的概念,我有三個程序,一個簡單,簡單的node.js程序,一個使用setImmediate(),另一個使用process.nextTick()。顯然,這三種行爲都有不同的表現。如果有人解釋這些程序在底層運行方式上的差異,並解釋使用兩種定時器來實現有效的Node.js編程的重要性,那將會非常有幫助。在Node.js中使用setImmediate()和process.nextTick()的意義

程序1:(無setImmediate()和process.nextTick())

var fs = require('fs'); 

function logCar(car, callback){ 
    console.log("Saw a %s", car); 
    if(cars.length){ 
    callback(); 
    } 
} 
function logCars(cars){ 
    var car = cars.pop(); 
    logCar(car, function(){ 
    logCars(cars); 
    }); 
} 
var cars = ["Ferrari", "Porsche", "Bugatti", 
      "Lamborghini", "Aston Martin"]; 
logCars(cars); 

var fileCheck = function(){ 
    console.log('entered file operation'); 
    fs.stat("fileio.js", function(err,stats){ 
    if(stats) 
    console.log("file exists"); 
    }); 
    } 

    fileCheck(); 

結果:

Saw a Aston Martin 
Saw a Lamborghini 
Saw a Bugatti 
Saw a Porsche 
Saw a Ferrari 
entered file operation 
file exists 

程序1:(含setImmediate())

var fs = require('fs'); 

function logCar(car, callback){ 
    console.log("Saw a %s", car); 
    if(cars.length){ 
    setImmediate(function(){ 
     callback(); 
    }); 
    } 
} 
function logCars(cars){ 
    var car = cars.pop(); 
    logCar(car, function(){ 
    logCars(cars); 
    }); 
} 
var cars = ["Ferrari", "Porsche", "Bugatti", 
      "Lamborghini", "Aston Martin"]; 
logCars(cars); 

var fileCheck = function(){ 
    console.log('entered file operation'); 
    fs.stat("fileio.js", function(err,stats){ 
    if(stats) 
    console.log("file exists"); 
    }); 
    } 

    fileCheck(); 

結果:

Saw a Aston Martin 
entered file operation 
Saw a Lamborghini 
file exists 
Saw a Bugatti 
Saw a Porsche 
Saw a Ferrari 

方案2:(與prcess.nextTick())

var fs = require('fs'); 

function logCar(car, callback){ 
    console.log("Saw a %s", car); 
    if(cars.length){ 
    process.nextTick(function(){ 
     callback(); 
    }); 
    } 
} 
function logCars(cars){ 
    var car = cars.pop(); 
    logCar(car, function(){ 
    logCars(cars); 
    }); 
} 
var cars = ["Ferrari", "Porsche", "Bugatti", 
      "Lamborghini", "Aston Martin"]; 
logCars(cars); 

var fileCheck = function(){ 
    console.log('entered file operation'); 
    fs.stat("fileio.js", function(err,stats){ 
    if(stats) 
    console.log("file exists"); 
    }); 
    } 

    fileCheck(); 

結果:

Saw a Aston Martin 
entered file operation 
Saw a Lamborghini 
Saw a Bugatti 
Saw a Porsche 
Saw a Ferrari 
file exists 
+1

請參閱[**同步和異步編程(在node.js中)**]之間的區別是什麼(http://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous-和異步編程節點)和[** setImmediate vs. nextTick **](http://stackoverflow.com/questions/15349733/setimmediate-vs-nexttick)。請讓我知道如果這些不回答你的問題。 – 2015-03-03 11:34:04

+0

setImmediate()推遲當前事件循環(logCars(汽車)),重要的I/O線程完成並返回到當前事件循環。 process.nextTick()會在當前事件循環結束後立即啓動I/O線程。我對嗎 ? 。如果錯了,請糾正我。 – 2015-03-03 12:10:41

+0

好吧,它並沒有真正「推遲」它,在事件循環中的每個點上,它都會看到它需要運行並執行它。除此之外,對我來說這似乎很好。 – 2015-03-03 12:21:08

回答

4

回調之前任何其他我process.nextTick()運行遞延/ O事件被解僱。
With setImmediate(),執行排隊後面任何已經在隊列中的I/O事件。