在Node.js中使用setImmediate()和process.nextTick()的意义

Significance of using setImmediate() and process.nextTick() in Node.js

本文关键字:nextTick process Node setImmediate js      更新时间:2023-09-26

我正在学习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:(带process.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

在触发任何其他I/O事件之前运行process.nextTick()延迟的回调。

使用setImmediate(),执行将在队列中已经存在的任何I/O事件之后排队。