Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
reactor模式在Node.js中是如何工作的?_Node.js - Fatal编程技术网

reactor模式在Node.js中是如何工作的?

reactor模式在Node.js中是如何工作的?,node.js,Node.js,我正在阅读Node.js设计模式。我被困在对反应堆模式的理解中。我在这里没有看到任何调用堆栈。我认为调用堆栈是Node.js设计的主要部分之一。有人能帮我理解这个图表吗?也没有回调队列。一切都从应用程序开始,应用程序发出请求,事件解复用器收集这些请求,然后形成队列、事件队列。事件解复用器由libuv运行,libuv是一个异步IO库,允许Node.js执行I/O 在图中可以看到一个事件队列。实际上,不仅有1个事件队列,还有7个基本队列。这些队列具有递增优先级,事件循环首先检查优先级最高的队列 计时


我正在阅读Node.js设计模式。我被困在对反应堆模式的理解中。我在这里没有看到任何调用堆栈。我认为调用堆栈是Node.js设计的主要部分之一。有人能帮我理解这个图表吗?也没有回调队列。

一切都从应用程序开始,应用程序发出请求,事件解复用器收集这些请求,然后形成队列、事件队列。事件解复用器由libuv运行,libuv是一个异步IO库,允许Node.js执行I/O

在图中可以看到一个事件队列。实际上,不仅有1个事件队列,还有7个基本队列。这些队列具有递增优先级,事件循环首先检查优先级最高的队列

计时器队列具有最高优先级。setTimeout和setInterval函数在此处排队。一旦事件在此队列中完成,或者时间到了,事件循环将这些函数传递给调用堆栈,在图中它被命名为execute handler

一旦其中一个事件队列完成,事件循环将首先检查另外两个队列,而不是跳到下一个队列,这两个队列将对其他微任务和process.nextTick函数进行排队。然后它将跳转到下一个队列。此图将帮助您可视化事件循环。

如果事件队列中没有事件,或者事件解复用器没有挂起的请求,则程序将完成

注意:您提到的回调队列是事件队列,调用堆栈是执行处理程序

  • 应用程序通过提交 请求事件解复用器。应用程序还指定一个处理程序,该处理程序将在操作完成时调用。向事件解复用器提交新请求是一个非阻塞调用,它会立即将控制权返回给应用程序
  • 当一组I/O操作完成时,事件解复用器 将一组相应的事件推送到事件队列中
  • 此时,事件循环在事件项上迭代 排队
  • 对于每个事件,将调用关联的处理程序
  • 作为应用程序代码一部分的处理程序返回 当事件循环的执行完成时(5a)将控制发送到事件循环。虽然 处理程序执行时,可以请求新的异步操作 (5b),使新项目添加到事件解复用器(1)
  • 当处理事件队列中的所有项目时,事件循环 在事件解复用器上再次阻塞,然后触发另一个事件 当新事件可用时循环

  • 归功于packtpub.com

    是的,我认为这样的图表会让任何人感到困惑。。。如果您只是看一些示例代码,而不是试图解释复杂的图表,这些图表并不能真正澄清任何事情,那么我认为无论“反应器模式”是什么,您都会更清楚。我的猜测是,根据名称,它意味着“基于事件的编程”,这在Node.js中非常自然,“一旦事件在这个队列中完成”,它如何知道事件已经完成?循环轮询来自操作系统的信息还是操作系统通知它?谁将事件处理到操作系统,何时决定处理?