其中是node.js事件队列
Where is the node.js event queue?
我看到过关于堆栈溢出的类似问题,但没有一个完全深入到我的问题中?我熟悉事件队列、它们的工作方式以及它们的实现。我是node.js的新手,我正试图了解node.js是如何做到这一点的
在c++应用程序中,您可以按照以下方式进行操作:
int main(){
std::vector<Handler*> handlers;
BlockingQueue queue = new BlockingQueue();
//Add all the handlers call constructors and other such initialization
//Then run the event loop
while(true){
Event e = queue.pop();
for( std::vector<Handler>::iterator it = handlers.begin(); it != handlers.end(); ++it){
*it.handle(e);
}
}
}
现在,在node.js的情况下,我可能有一个名为main.js的主文件,看起来像。
var http = require("http");
function main(){
// Console will print the message
console.log('Server running at http://127.0.0.1:8080/');
var server = http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World'n');
});
server.listen(8080);
console.log('Main completed');
}
main();
我知道server.listen正在向事件队列附加一个处理程序,我们正在添加类似于c++示例的回调。
我的问题是,事件队列在哪里?它是在javascript中的某个地方,还是内置在解释器中?此外,相对于主事件循环,如何调用主函数?
事件队列在哪里?它是在javascript中的某个地方还是内置在解释器中?
事件队列内置于承载Javascript解释器的操作环境中。它不是Javascript本身的基础,所以它不是实际JS运行时的一部分。其中一个有趣的指标是setTimeout()
实际上不是ECMAScript的一部分,而是由主机提供给Javascript环境的东西。
node.js中围绕Javascript实现的系统会跟踪外部触发的事件(计时器、网络结果等),当Javascript不忙于执行某个事情而发生外部事件时,它会触发相关的Javascript回调。如果Javascript正忙于执行某件事,那么它会对该事件进行排队,以便一旦Javascript不再繁忙,它就可以触发队列中的下一个事件。
node.js本身使用libuv
进行事件循环。你可以在这里阅读更多。它提供了一种多平台的异步I/O方式,该方式是为node.js开发的,但也被其他一些项目使用。
以下是一个可能也有帮助的相关答案:
在节点中等待回调时运行任意代码?
此外,相对于主事件如何调用主函数环
当node.js启动时,会给它一个要执行的初始脚本文件。它将该脚本文件加载到内存中,解析其中的Javascript并执行它。在您的特定示例中,这将导致函数main
被解析,然后将导致运行该函数的main()
的执行。
当node.js启动时,加载、解析和执行传递给它的脚本文件是node.js的任务。它与事件队列根本没有关系。在一些node.js应用程序中,它运行初始脚本,然后退出(完成工作)。在其他node.js应用程序中,初始脚本启动计时器或服务器或类似的东西,这些东西将来会接收事件。在这种情况下,node.js会运行初始脚本直到完成,但因为现在有一些持久的对象已经创建并正在侦听事件(在您的情况下是服务器),所以nodejs不会关闭应用程序。它让它保持运行,以便在未来事件发生时接收这些事件。
这里缺少的一点是,像您创建的服务器对象这样的东西允许您注册一个回调,将来当某些特定事件发生时,该回调将被调用一次或多次。这种行为没有内置在Javascript中。相反,实现这些对象或它们使用的TCP函数的代码必须维护一个已注册回调的列表,当这些事件发生时,它必须执行代码,以便调用适当的回调并传递适当的数据。在http.createServer()
的情况下,它是nodejshttp库中Javascript和本机代码的混合体,使其发挥作用。
- 为什么js事件消失了
- 使用onkeyup JS事件检查输入的值是否唯一
- JS事件未更改输入禁用属性
- jQuery的等价物's$(this)在Ractive.js事件代理中
- Raphael JS事件未开火
- Ajax 请求正在取消页面上的其他 JS 事件
- 当多个 JS 事件调用同一个函数时,如何处理它们
- 主干.js事件处理程序命名的最佳做法
- js事件,用于函数内部的when语句变为true
- React.js事件需要点击2次才能执行
- 有没有一种方法可以将我的JS函数排队到JSF事件队列中
- 单击文档时的Backbone JS事件
- 在添加元素时激发JS事件
- 作为自动化测试的一部分,监控特定的js事件以及执行它们所需的时间
- JS事件CTRL+鼠标悬停+隐藏文本
- Backbone.js事件未启动
- JS调试器是否挂起整个JS事件循环
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 其中是node.js事件队列
- 理解node.js事件队列和process.nextTick