Я изучаю Node.js и очень тяжело разбираюсь в работе setImmediate() и process.nextTick(). Чтобы понять понятные понятия, у меня есть три программы, одна простая простая программа node.js, одна с помощью setImmediate() и одна с помощью process.nextTick(). По-видимому, все трое ведут себя по-разному. Было бы очень полезно, если кто-нибудь объяснит, как эти программы отличаются в работе под капотом и объясняют важность использования обоих таймеров для эффективного программирования Node.js.Значимость использования setImmediate() и process.nextTick() в Node.js
Программа 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). Пожалуйста, дайте мне знать, если они не отвечают на ваш вопрос. –
setImmediate() откладывает текущий цикл событий (logCars (автомобили)), придавая значение потоку ввода-вывода для завершения и возвращается к текущему циклу событий. process.nextTick() помещает поток ввода-вывода для запуска сразу после окончания текущего цикла событий. Я прав ? , Если неправильно, исправьте меня. –
Ну это на самом деле не «откладывает» его, в каждой точке цикла событий он видит, что ему нужно запускать и исполняет. Кроме того, мне кажется хорошо. –