JavaScript / Node.js事件循环tick id

JavaScript / Node.js event loop tick ids

本文关键字:循环 tick id 事件 js Node JavaScript      更新时间:2023-09-26

我想知道是否有一些整洁的方法可以知道函数是否在当前滴答(函数声明的滴答)中被调用,或者Node.js事件循环的下一个滴答(或一些未来的滴答)

例如:

function foo(cb){
  // we can fire callback synchronously
  cb();
  // or we can fire callback asynchronously
  process.nextTick(cb);
}

say将像这样调用foo:

function outer(){
   const currentTickId = process.currentTickId;
  function bar(){          //bar gets created everytime outer is called..
    if(process.currentTickId === currentTickId){
       //do something
    }
    else{
     // do something else
    }

  }
  // foo is always called in the same tick that bar was
  // declared, but bar might not be called until the next tick
  foo(bar);  

}

大多数应用程序不需要这样的东西,但我正在编写一个库,如果可能的话,拥有这个功能将是有用的!注意,process.currentTickId是我在这个例子中创建的

看起来你已经发现了process.nextTick

你可以用这个来建立一个系统来实现"process.currentTickId",因为你的问题中的代码表明你需要:

process.currentTickId = 0;
const onTick = () => {
    process.currentTickId++;
    process.nextTick(onTick);
};
process.nextTick(onTick);

NPM lib:https://www.npmjs.com/package/event-loop-ticks

基于@Emmett post的改进答案:

let _tick = 0;
const onTick = () => {
  _tick++;
  setImmediate(() => process.nextTick(onTick)).unref();
};
process.nextTick(onTick);