簡體   English   中英

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

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

我正在學習 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

使用process.nextTick()延遲的回調在任何其他 I/O 事件被觸發之前運行。

使用setImmediate() ,執行將在隊列中已經存在的任何 I/O 事件之后排隊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM