2015-03-03 2 views
0

Я изучаю 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 
+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). Пожалуйста, дайте мне знать, если они не отвечают на ваш вопрос. –

+0

setImmediate() откладывает текущий цикл событий (logCars (автомобили)), придавая значение потоку ввода-вывода для завершения и возвращается к текущему циклу событий. process.nextTick() помещает поток ввода-вывода для запуска сразу после окончания текущего цикла событий. Я прав ? , Если неправильно, исправьте меня. –

+0

Ну это на самом деле не «откладывает» его, в каждой точке цикла событий он видит, что ему нужно запускать и исполняет. Кроме того, мне кажется хорошо. –

ответ

4

Callbacks отложила с process.nextTick() выполнения перед тем любой другой I/O событие запускается.
С setImmediate(), исполнение поставлено в очередь за любое событие ввода-вывода, которое уже находится в очереди.

Смежные вопросы