javascript - 我需要 Node.js 事件循环的一个很好的类比。

标签 javascript node.js snmp

我一直在读一本关于 Node 的好书,主题是 Node.js 非阻塞框架。我有 VB 背景,所以我习惯于看到代码按顺序运行。对于下面的代码,关于非阻塞异步框架。这里的事件是什么,事件循环不应该在“for”上拾取意味着这是事件并且按顺序 Node 在 i++ = var i 之前不应该执行任何操作吗?

我问这个问题的原因是我正在考虑一个 SNMP 服务器端应用程序,但我无法理解如果我告诉它 ping 10 个设备,node.js 会做什么。如果第 7 个 IP 离线,我必须等待 snmp 超时才能转到第 8 个 IP,这是正确的吗?

var http = require('http'),
  urls = ['shapeshed.com', 'www.bbc.co.uk', 'edition.cnn.com'];

function fetchPage(url) {
  var start = new Date();
  http.get({ host: url }, function(res) {
    console.log("Got response from: " + url);
    console.log('Request took:', new Date() - start, 'ms');
  });
}

for(var i = 0; i < urls.length; i++) {
  fetchPage(urls[i]);
}

最佳答案

拥有 VB 背景的您有一个优势:VB 也是事件驱动的!您是否曾经需要在 VB 代码中使用 DoEvents() ?这告诉 VB 运行事件队列中的待处理事件。

不同之处在于,在 VB 中,事件通常是用户触发的、基于 UI、鼠标单击等。 Node 主要是服务器端,其事件主要围绕 I/O。

您的代码永远不会被中断或阻塞(除非您故意这样做)。例如,在上面的代码片段中,对 http.get 的调用意味着“获取此 URL,并在完成后调用此回调”。这将启动 http 请求并立即返回。因此,您的 for 循环将遍历所有 URL,启动所有 get 操作,然后完成。

此时,您从函数中返回,并且 Node 返回到事件循环。一旦请求完成, Node 就会将该请求的回调安排到事件循环中,并且回调最终将运行。

需要考虑一件事:如果其中一个 http 请求在 for 循环完成之前完成怎么办?在这种情况下,回调将被安排在事件循环上。但您还没有回到事件循环,您仍在运行 for 循环。在您从当前正在运行的任何函数返回之前,不会执行任何回调。

这种“不要在事件处理程序中做太多事情”的建议对于 VB 程序员来说应该非常熟悉。

关于javascript - 我需要 Node.js 事件循环的一个很好的类比。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285171/

相关文章:

javascript - 在 Javascript 中替换头部样式表路径

javascript - 使用 php 在 AJAX 中进行长轮询

node.js - socket.io 客户端未接收来自服务器的广播

javascript - 如何以及在何处正确连接和结束nodejs中的mongoDB连接

java - 如何在 Windows 中进行 SNMP 查询?

javascript - 使用 Regex 将 location.hash 分解为数组

node.js - Node JS 查询 request.query 为空

c# - 从 USB 打印机获取信息

c - net-snmp api 使用用户的凭据

javascript - 将repeat.for中的对象绑定(bind)到自定义元素