事件循环

简介: 【10月更文挑战第28天】

Node.js的事件循环是其非阻塞I/O和异步编程的核心机制。它使得Node.js能够在单线程上处理大量并发操作,而不需要多线程编程。以下是对Node.js事件循环和事件驱动模型的进一步解释,以及如何使用它们。

事件循环和事件驱动模型

在Node.js中,事件循环不断地检查事件队列,并处理事件,如客户端请求、文件读写完成、数据库查询结果等。当一个事件被处理时,相应的回调函数会被执行。

Node.js的事件驱动模型类似于观察者模式,其中事件是主题,注册到事件上的回调函数是观察者。当事件被触发时,所有注册的回调函数都会被执行。

使用EventEmitter

EventEmitter是Node.js中用于事件驱动编程的核心类。以下是如何使用EventEmitter的示例:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   
   console.log('连接成功。');
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);

// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

当你运行这段代码时,你会看到以下输出:

连接成功。
数据接收成功。
程序执行完毕。

这表明connection事件被触发,执行了connectHandler函数,该函数又触发了data_received事件。

异步I/O示例

Node.js的异步I/O是事件循环的另一个重要应用。以下是使用fs模块异步读取文件内容的示例:

var fs = require("fs");

// 异步读取文件
fs.readFile('input.txt', function (err, data) {
   
   if (err){
   
      console.log('发生错误:', err);
      return;
   }
   console.log(data.toString());
});

console.log("程序执行完毕");

在这个示例中,fs.readFile是异步执行的。它不会阻塞后续代码的执行。当文件读取操作完成时,回调函数会被添加到事件队列中。事件循环最终会处理这个事件,并执行回调函数,打印文件内容。

输出结果将是:

程序执行完毕
菜鸟教程官网地址:www.runoob.com

注意,"程序执行完毕"会先于文件内容打印,因为文件读取是异步的。

目录
相关文章
|
3月前
|
人工智能 安全 数据挖掘
MCP
模型上下文协议(MCP)是一种全新开放标准,旨在解决大型语言模型(LLM)与外部世界连接的局限。它为LLM与工具、数据库、硬件等建立统一、安全、标准化的通信机制,让AI从“全能模型”转变为可连接万物的“生态核心”,推动AI应用向更广泛领域扩展,开启通往通用人工智能(AGI)的新篇章。
|
9月前
|
监控 机器人 数据挖掘
|
11月前
|
人工智能 IDE 程序员
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
通义灵码 2.0 不仅正式发布 AI 程序员,还升级了很多基础能力,使用场景多样。繁星计划的推出更为大学生提供了免费的智能编码助手,助力科技创新。让不具备编码能力的人也可以将 idea 变成产品,帮助到更多开发者和泛开发者。
|
Web App开发 JavaScript 前端开发
浏览器与Node.js事件循环:异同点及工作原理
浏览器与Node.js事件循环:异同点及工作原理
|
消息中间件 存储 前端开发
「3.4w字」超保姆级教程带你实现Promise的核心功能
该文章通过详细的步骤和示例代码,逐步介绍了如何从零开始实现一个符合ECMAScript标准的Promise对象,涵盖了Promise的基本使用、状态管理、链式调用、错误处理机制及Promise.all和Promise.resolve等方法的实现。
「3.4w字」超保姆级教程带你实现Promise的核心功能
|
缓存 前端开发 JavaScript
前端性能优化方案
【8月更文挑战第15天】前端性能优化方案
669 2
|
JavaScript 前端开发
使用js,html,css实现歌词滚动的效果
使用js,html,css实现歌词滚动的效果
320 0
|
移动开发 HTML5
WebSocket心跳机制
WebSocket心跳机制
384 0
|
运维 算法 大数据
基于实时计算(Flink)与高斯模型构建实时异常检测系统
案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 1. 概述 异常检测(anomaly detection)指的是对不符合预期模式或数据集(英语:dataset)中其他项目的项目、事件或观测值的识别。
8544 0
|
自然语言处理 数据处理 API
军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏等教学,助力工业应用场景快速落地
军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏等教学,助力工业应用场景快速落地
军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏等教学,助力工业应用场景快速落地

热门文章

最新文章