我一直在读一本关于 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/