节点JS计时器API的执行顺序

时间:2014-08-13 04:31:01

标签: javascript node.js asynchronous

我对node.js很新。我试图了解异步'的确切含义。就节点js而言。

在上面的上下文中,我有以下代码: -

function foo()
{
  setImmediate(function two()
  {
    console.log(1);
  });
  setTimeout(function one()
  {
    console.log(3);
  },0);
  process.nextTick(function three()
  {
    console.log(2);
  });
  console.log(4);
}
foo();

有些人可以深入地解释一下,对于所有上述计时器API的执行顺序究竟是什么,为什么会这样?有关回叫堆栈等的任何解释/参考也会有所帮助。

1 个答案:

答案 0 :(得分:3)

首先,首先记录4,因为对setImmediatesetTimeoutnextTick的所有其他调用将函数的执行延迟到当前正在执行的代码之后的某处。但他们都采用不同的方式:

<强>的setTimeout 此功能允许您在特定的毫秒之后执行某些操作。如果传递给此函数的毫秒数小于1毫秒,则在调用函数之前总是等待1毫秒。

<强> setImmediate 此功能允许您在节点处理完所有I / O事件后执行某些操作。节点处理事件队列的每个周期中的i / o事件。因此setTimeout将始终在事件队列的下一个循环中执行您的函数。这允许队列旋转未阻止。

<强> process.nextTick 此功能允许您在当前运行的代码完成后立即执行某些操作。您可以想象它就像您可以修改当前正在执行的代码并在其后添加一些行,以便它在完成之前执行更多操作。一次又一次地调用此函数会阻止事件循环,因为它无法继续执行队列中的下一个任务,因为它仍然忙于当前任务。这意味着,节点不会处理i / o事件,直到您传递给nextTick的最后一个函数被执行。因此,您不应该递归调用此函数或过多地使用它,因为它可以阻止事件循环旋转。如果发生这种情况,节点将显示警告。

所以......来解释4 2 1 3的输出:

  1. 4是第一个没有延迟的日志,因此是第一个输出。

  2. 2在foo()完成后立即记录,因此是第二个

  3. 3比1更快,因为通常的事件循环周期比1毫秒快得多,所以.. 3是第三个日志

  4. setTimeout延迟至少1ms,这是所有延迟功能的最长延迟。它显然是最后一个。