当前位置: 首页 > 面试题库 >

了解node.js事件队列和process.nextTick

应安国
2023-03-14
问题内容

我无法确切了解process.nextTick其功能。我以为自己了解了,但似乎无法复制自己的感觉:

var handler = function(req, res) {
    res.writeHead(200, {'Content-type' : 'text/html'});
    foo(function() {
        console.log("bar");
    });
    console.log("received");
    res.end("Hello, world!");
}

function foo(callback) {
    var i = 0;
    while(i<1000000000) i++;
    process.nextTick(callback);
}

require('http').createServer(handler).listen(3000);

虽然foo循环的,我会寄过来几个请求,假设handler将排队几次身后foocallback只在被排队foo完成。

如果我对它的工作方式是正确的,我认为结果将如下所示:

received
received
received
received
bar
bar
bar
bar

但这不是连续的:

received
bar
received
bar
received
bar
received
bar

我看到这foo是在执行之前返回的,callback这是预期的,但似乎callback是NEXT在行,而不是在队列的末尾,在所有请求的后面。这是它的工作方式吗?也许我只是不了解节点中事件队列的工作原理。而且请不要在这里指点我。谢谢。


问题答案:

process.nextTick将该回调放在将要执行的下一个刻度上,而不是在刻度队列的末尾。

Node.js文档(http://nodejs.org/api/process.html#process_process_nexttick_callback)说:“它通常在任何其他I
/ O事件触发之前运行,但是有一些例外。”

setTimeout(callback,0)可能会像您描述的那样工作。



 类似资料:
  • 问题内容: 我已经在堆栈溢出中看到了类似的问题,但是没有一个问题完全陷入我所遇到的问题吗?我熟悉事件队列,它们如何工作以及如何实现。我是Node.js的新手,我想围绕Node.js的工作方式进行总结。 在c ++应用程序中,您将按照以下方式进行操作: 现在,在使用node.js的情况下,我可能会有一个看起来像main.js的主文件。 我了解server.listen会将处理程序附加到事件队列,并且

  • 我们正在构建一个具有Node.js服务器和Express的架构体系。 在服务器中,发生的情况如下所示: 服务器接受来自客户端的传入HTTP请求 服务器生成两个文件(此操作可能“相对较长”,也就是0.1秒左右) 服务器将生成的文件(每个文件约20-200 KB)上载到外部CDN 服务器响应客户机,这包括CDN上文件的URI 目前,服务器正在为每个请求按顺序执行此操作,并且效果非常好(Node/Exp

  • 我刚才看到了三个方法的文档,当我们在工作线程中工作时,它们可以用来在UI线程中执行一段代码。方法有: > public final void runOnUIThread(Runnable action)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列中 public boolean post(Runnable act

  • 我很难理解linkedlist队列的enqueue方法的代码。我理解dequeue()、isEmpty()、First()和size()。首先,这里有一个LinearNode类来创建新的节点对象: 下面是Enqueue方法 在此编辑包含Enqueue方法的LinkQueue类:

  • 问题内容: 可以以标准方式执行此操作吗? 这是场景。 开始在EDT中执行一些昂贵的操作(EDT被阻止,直到昂贵的操作结束为止)。 在阻止EDT的同时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。 当EDT免费时(用昂贵的东西完成),它开始处理鼠标事件。 我在步骤3中想要的是丢弃堆积的鼠标事件。EDT释放后,任何新的鼠标事件都应按常规方式处理。 关于如何实现这一目标的任何想法。 PS:对于

  • 问题内容: 我正在考虑,这是我想到的: 假设我们有这样的代码: 一个请求进入,并且JS引擎逐步开始执行上述代码。前两个呼叫是同步呼叫。但是当涉及到方法时,它将成为异步执行。但是JS立即从中返回并继续执行,这称为或。并且它继续在其他等等上工作。 执行结果如下: 交流数据库 因此,基本上第二个首先完成,其回调函数比第一个早执行,这是有道理的。 我们在这里谈论单线程应用程序。JS Engine会继续执行