为了更好地理解异步和Fibre,我想知道是否存在一个全局变量,该变量在事件循环的每一回合都递增。

我希望能够在每个console.log语句中看到打印出的不同值,并且显然我们不能依靠系统时间来这样做。

function getEventLoopCounter () { /* magic occurs */ }

// Turn 1
console.log("I'm on loop number: ", getEventLoopCounter());

// Turn > 1
setTimeout(function(){
  console.log("I'm on different loop: ", getEventLoopCounter());
}, 0);

最佳答案

也许 setImmediate 中的Node timers module将起作用。文档中对 setImmediate 的引用:



使用函数闭包和递归,您可以执行以下操作:

var eventLoopCounter = 0;
setImmediate(function incrementEventLoopCounter() {
  eventLoopCounter++;
  setImmediate(incrementEventLoopCounter);
});
// Logging the total number of iterations every second.
setInterval(function() {
  console.log('The event loop has finished '
               + eventLoopCounter
               + ' iterations.');
}, 1000);

顺便说一句,在timers模块文档的开头,它指出:



这就是为什么setImmediate不需要timers模块就可以工作的原因。

我想我应该注意,我尝试使用 process.nextTick 做类似的事情,但是在出现一系列有用的警告消息之前出现错误,这些警告消息使我指向上面的函数:
...
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

RangeError: Maximum call stack size exceeded

09-13 02:14