- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
首先,我想了解什么是 Node.Js。我有两个问题。
第一个问题
来自 the article Felix,它说“只能同时触发一个回调。在该回调完成执行之前,所有其他回调都必须排队等待”。
然后,考虑以下代码(从nodejs官网复制)
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
如果同时收到两个客户端请求,则表示如下工作流程:
我说的对吗?如果我是对的,如果在很短的时间内有数千个客户端请求,Node.js 如何控制。
第二个问题
术语“事件循环”主要用于 Node.js 主题。我从 http://www.wisegeek.com/what-is-an-event-loop.htm 中将“事件循环”理解为以下内容;
An event loop - or main loop, is a construct within programs that controls and dispatches events following an initial event.
The initial event can be anything, including pushing a button on a keyboard or clicking a button on a program (in Node.js, I think the initial events will be http request, db queries or I/O file access).
This is called a loop, not because the event circles and happens continuously, but because the loop prepares for an event, checks the event, dispatches an event and repeats the process all over again.
我对第二段有冲突,尤其是“repeat the process all over again”这句话。我接受上述问题中的上述 http.createServer 代码绝对是“事件循环”,因为它反复监听 http 请求事件。
但我不知道如何识别以下代码是事件驱动还是事件循环。除了 db 查询完成后触发的回调函数之外,它不会重复任何内容。
database.query("SELECT * FROM table", function(rows) {
var result = rows;
});
请让我听听你的意见和答案。
最佳答案
回答一个,你的逻辑是正确的:第二个事件会等待。并将在其排队的回调时间到来时执行。
另外,请记住,在技术世界中没有“同时”这样的东西。一切都有非常具体的地点和时间。
node.js 管理数千个连接的方式是,当有一些数据库调用阻塞逻辑或另一个 IO 操作正在处理(例如流)时,不需要保持线程空闲。它可以“服务”第一个请求,也许会创建更多回调,然后继续处理其他请求。
因为没有办法阻止执行(除了废话 while(true) 和类似的东西),它在将实际资源分散到整个应用程序逻辑方面变得非常有效。
线程 - 很昂贵,线程的服务器容量与可用内存直接相关。因此,大多数经典 Web 应用程序都会受到影响,因为 RAM 用于在有数据库查询 block 或类似情况时简单空闲的线程上。在 Node 中,情况并非如此。
不过,它允许通过 cluster
创建多个线程(作为 child_process) ,这扩展了更多的可能性。
回答二。没有您可能想到的“循环”之类的东西。幕后不会有任何循环来检查是否有连接或接收到任何数据等等。现在它也由 Async 方法处理。
所以从应用程序的角度来看,没有“主循环”,从开发人员的角度来看,一切都是事件驱动的(不是事件循环)。
如果使用 http.createServer
,您可以将回调绑定(bind)为对请求的响应。所有的套接字操作和 IO 东西都将在幕后发生,以及 HTTP 握手、解析 header 、查询、参数等。一旦它在幕后发生并且工作完成,它将保留数据并将回调推送到带有一些数据的事件循环。一旦事件循环空闲并且到了时间,它将在 node.js 应用程序上下文中执行您的回调,并使用来自幕后的数据。
使用数据库请求 - 同样的故事。它准备好并询问一些东西(甚至可能再次异步),然后一旦数据库响应并且将为应用程序上下文准备数据就会回调。
说实话,使用 node.js 所需要的只是理解概念,而不是事件的实现。最好的方法是实验。
关于node.js - Node.js 中的单线程和事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580048/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!