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
請參閱[**同步和異步編程(在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
setImmediate()推遲當前事件循環(logCars(汽車)),重要的I/O線程完成並返回到當前事件循環。 process.nextTick()會在當前事件循環結束後立即啓動I/O線程。我對嗎 ? 。如果錯了,請糾正我。 – 2015-03-03 12:10:41
好吧,它並沒有真正「推遲」它,在事件循環中的每個點上,它都會看到它需要運行並執行它。除此之外,對我來說這似乎很好。 – 2015-03-03 12:21:08