Node.js的内置模块event,怎么实现发布订阅模式教程(node.js发布项目)

admin554656年前0条评论

对于宣布定阅形式想必人人并不生疏,它在异步交互中拥有很年夜的感化,能够使咱们的代码构造更加清晰易读,便于保护。

 Node.js的内置模块 event,怎么实现发布订阅模式教程(node.js 发布项目) 技术教程

node中咱们能够应用 内置模块event 来实现宣布定阅形式,这篇文章咱们将深入去深造event并演示它在咱们实践开辟中的感化,让咱们最先吧!

一、开端应用

引入event内置模块

// 引入内置模块eventconstEventEmitter=require("events");

建立event工具

event内置模块实质是一个构造函数,咱们需要通过new操纵符去调用它

// 建立event工具const event = new EventEmitter();

监听事件

应用event工具上的on函数来界说一个监听事件,语法为:event.on(事件名,事件解决函数)

// 监听run事件event.on("run", (data) => {console.log("run事件运行,参数为:", data);});

触发事件

应用event工具上的emit函数来触发监听的事件,语法为:event.emit(需要触发的事件名,需要给事件解决函数通报的参数)

// 触发run事件event.emit("run", "111111");

完好代码

// 引入内置模块eventconst EventEmitter = require("events");// 建立event工具const event = new EventEmitter(); // 监听run事件event.on("run", (data) => {console.log("run运行,参数为:", data);}); // 触发run事件event.emit("run", "111111");

运行效果:

 Node.js的内置模块 event,怎么实现发布订阅模式教程(node.js 发布项目) 技术教程

❗️事件重复监听的问题

==细致:当统一事件被监听屡次时,触发事件时会同时触发这个事件的所有事件解决函数==

 Node.js的内置模块 event,怎么实现发布订阅模式教程(node.js 发布项目) 技术教程

二、应用

应用node模拟get申请(转发跨域数据):

const http = require("http");const https = require("https");// http以及https的区分仅在于一个是http协定一个是https协定const url = require("url"); const server = http.createServer(); server.on("request", (req, res) => {const urlObj = url.parse(req.url, true); res.writeHead(200, {"content-type": "application/json;charset=utf-8","Access-Control-Allow-Origin": "http://127.0.0.1:5500",}); switch (urlObj.pathname) {case "/api/maoyan":// 咱们界说的httpget方法:使node充当客户端去猫眼的接口获取数据httpget((data) => res.end(data)); // 细致这里break; default:res.end("404");break;}}); server.listen(3000, () => {console.log("效劳器启动啦!");}); function httpget(cb) {// 界说一个寄存数据的变量let data = "";// 因为猫眼的接口是https协定的,以是咱们需要引入https// http以及https都拥有一个get方法能够发起get申请,区分是一个是http协定,一个是https协定// http get方法第一个参数为接口所在,第二个参数为回调函数https.get("https://i.maoyan.com/api/妹妹db/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4",(res) => {// http get方法获取的数据是一点点返回的,并非间接返回全部// 监听data,当稀有据返回时就会被调用res.on("data", (chunk) => {// 收罗数据data += chunk;});// 监听end,数据返回完毕后调用res.on("end", () => {cb(data); // 细致这里});});}

细致下面代码的第19行以及第49行:

httpget((data) => res.end(data)); // 细致这里
cb(data); // 细致这里

这个例子中,咱们是通过在httpget函数中传入一个回调函数来接受httpget函数获取到的数据,这种写法实践是不问题的,在开辟中也每一每一停止应用。

但在一些状况下,尤其是函数多层嵌套调用时(下列面的例子),这种写法就显患上不足文雅,因为它的代码构造不是很清晰,不能很直不雅的看懂其逻辑:

function user() {getUser((data) => {console.log(data);});} function getUser(cb) {// ....const id = 1;getUserInfo(cb, id);} function getUserInfo(cb, id) {// ....const name = id + "Ailjx";cb(name);}

让咱们应用内置模块event去革新一下下面node模拟get申请(转发跨域数据)的案例:

const http = require("http");const https = require("https");const url = require("url");const EventEmitter = require("events");const server = http.createServer(); // 寄存event工具let event = ""; server.on("request", (req, res) => {const urlObj = url.parse(req.url, true); res.writeHead(200, {"content-type": "application/json;charset=utf-8","Access-Control-Allow-Origin": "http://127.0.0.1:5500",}); switch (urlObj.pathname) {case "/api/maoyan":event = new EventEmitter(); // 细致该地位// 监听事件event.on("resEnd", (data) => {res.end(data);});httpget();break; default:res.end("404");break;}}); server.listen(3000, () => {console.log("效劳器启动啦!");}); function httpget() {let data = "";https.get("https://i.maoyan.com/api/妹妹db/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4",(res) => {res.on("data", (chunk) => {data += chunk;});res.on("end", () => {// 触发事件并通报数据event.emit("resEnd", data);});});}

运行并调用/api/maoyan接口:

 Node.js的内置模块 event,怎么实现发布订阅模式教程(node.js 发布项目) 技术教程

接口失常应用

细致上边代码new EventEmitter()的地位,如果new EventEmitter()是在外部的话,相当因而只有一个全局的event工具,当咱们每一次调用/api/maoyan接口时,node都会监听一个新的resEnd事件,这就会以致resEnd事件被重复监听

 Node.js的内置模块 event,怎么实现发布订阅模式教程(node.js 发布项目) 技术教程

以是咱们才需要将建立event工具的代码new EventEmitter()写到接口的case分支里,如许当咱们调用这个接口时,会建立一个新的event工具,老的event工具被弃用会被JS垃圾解决机制给解决失落,如许就不会浮现resEnd事件被重复监听的问题

你可能想看:

本文链接:https://addon.ciliseo.com/nodejs-de-nei-zhi-mo-kuai-event-zen-me-shi-xian-fa-bu-ding-yue-mo-shi-jiao-cheng.html

Node.js内置模块模块模式教程Nodejsevent事件函数对象数据接口注意代码协议参数
教程教程是什么意思教程视频教程的英文教程网教程魔方教程手工教程之家网教程画画教程之家教程之家官网教程今日己更新2023教程网站教程自学网教程英语教程资源网教程学习之家教程英文教程是什么教程学分班教程支语教程是什么dcard数据恢复大师数据蛙安卓恢复专家数据传输到新手机数据恢复大师免费版数据漫游是什么意思数据分析师证书怎么考数据港数据港股票数据恢复数据分析需要学哪些数据图表数据蛙数据恢复专家数据表数据恢复软件免费版数据库数据透视表的使用方法数据蛙数据透视表数据分析数据结构数据集数据蒸馏数据可视化数据标注数据中心代码代码生成器代码ai编写代码编程教学入门代码网站代码怎么编写代码编程软件代码编辑器代码怎么运行代码随想录代码大全代码在线运行代码练习代码怎么写代码大全可复制代码运行在线工具代码对比代码随想录github代码ai代码高亮代码随想录完整版pdf代码查重接口类型接口仅支持数字音频设备接口typec接口是什么意思接口测试的流程和步骤接口英文接口和抽象类的区别接口crc错误计数接口仅支持数字音频设备怎么办接口转换器接口盒子接口测试工具接口协议接口报文接口type-c接口板接口文档接口英文接口异常退出接口测试接口自动化接口设计接口文档示例接口幂等注意力缺陷障碍症最佳治愈方法注意力不集中容易走神是什么原因注意缺陷多动障碍是什么意思注意力集中不了老是走神怎么办注意力不集中怎么改善注意力缺陷症注意力缺陷多动障碍的表现

网友评论

扫一扫二维码添加客服微信

关于我们建站招商建站服务