gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

Node.js的內置模塊 event,利用它怎么實現發布訂閱模式

對于發布訂閱模式想必大家并不陌生,它在異步交互中具有很大的作用,能夠使我們的代碼結構更加清晰易讀,便于維護。

Node.js的內置模塊 event,利用它怎么實現發布訂閱模式

node.js極速入門課程:進入學習

node中我們可以使用 內置模塊event 來實現發布訂閱模式,這篇文章我們將深入去學習event并演示它在我們實際開發中的作用,讓我們開始吧!【相關教程推薦:nodejs視頻教程】

一、初步使用

引入event內置模塊

// 引入內置模塊event const EventEmitter = 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");

完整代碼

// 引入內置模塊event const 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的內置模塊 event,利用它怎么實現發布訂閱模式

二、應用

在上一節Node.js | 搭建后端服務器(含內置模塊 http | url | querystring 的使用)中有一個使用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/mmdb/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/mmdb/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,利用它怎么實現發布訂閱模式

接口正常使用

注意上邊代碼new EventEmitter()的位置,如果new EventEmitter()是在外部的話,相當于是只有一個全局的event對象,當我們每次調用/api/maoyan接口時,node都會監聽一個新的resEnd事件,這就會導致resEnd事件被重復監聽

Node.js的內置模塊 event,利用它怎么實現發布訂閱模式

所以我們才需要將創建event對象的代碼new EventEmitter()寫到接口的case分支里,這樣當我們調用這個接口時,會創建一個新的event對象,老的event對象被棄用會被JS垃圾處理機制給處理掉,這樣就不會出現resEnd事件被重復監聽的問題

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产男女激情视频| 欧美 国产 综合| 国内自拍视频网| 免费在线a视频| 久久亚洲精品无码va白人极品| 久久国产精品免费观看| www.com黄色片| 色婷婷一区二区三区av免费看| 91黄色在线看| 欧美国产日韩激情| 三上悠亚久久精品| 日韩黄色片视频| 亚欧在线免费观看| 不卡影院一区二区| 欧美午夜aaaaaa免费视频| 色多多视频在线播放| 国产精品久久a| 白白操在线视频| 9色porny| 激情六月丁香婷婷| 久久久精品麻豆| 亚洲AV无码成人精品一区| 色中文字幕在线观看| 日韩一级特黄毛片| 国产天堂在线播放| 亚洲视频一二三四| 日本一级黄视频| 成人在线免费在线观看 | 美脚丝袜脚交一区二区| 97视频久久久| 欧美一级黄色影院| 免费观看中文字幕| 久久9精品区-无套内射无码| 日韩毛片在线免费看| 三区视频在线观看| 国产在线精品91| 亚洲激情在线看| 久久成人福利视频| 欧美日韩精品区别| 日韩五码在线观看| 欧美xxxxxbbbbb| 国产素人在线观看| 亚洲综合激情五月| 国产 porn| 777av视频| 日本福利视频导航| 欧美成人黑人猛交| 成人网站免费观看入口| 日本不卡一区在线| 无码人妻丰满熟妇区毛片| 亚洲激情免费视频| 男女污污视频网站| 50路60路老熟妇啪啪| www.avtt| 国产精品一色哟哟| 蜜桃视频成人在线观看| 天堂中文视频在线| 午夜精品久久久内射近拍高清| www.com污| 自拍偷拍 国产| 六月激情综合网| 国产婷婷一区二区三区| 久久久久久久香蕉| 成年人黄色在线观看| 一级做a免费视频| www.色偷偷.com| 日本中文字幕高清| 欧美一级片中文字幕| 欧美日本视频在线观看| 中文字幕日韩精品无码内射| 日本一本草久p| 今天免费高清在线观看国语| 一级黄色大片儿| 51自拍视频在线观看| 欧美又黄又嫩大片a级| 天堂在线中文在线| 国产大片一区二区三区| 992kp免费看片| 国产精品三级一区二区| 成人免费观看cn| 日韩中文字幕二区| 老司机午夜av| 亚洲热在线视频| 欧美国产视频一区| 人妻av中文系列| 最新中文字幕2018| 波多野结衣免费观看| 国产精品久久国产| 草草久久久无码国产专区| 色一情一乱一伦一区二区三区日本| 精品少妇在线视频| 搡女人真爽免费午夜网站| 欧美美女一级片| 草草草视频在线观看| 欧美韩国日本在线| 国产a级片免费看| 97国产在线播放| 欧美视频国产视频| 黑人巨茎大战欧美白妇| 丰满爆乳一区二区三区| 91网址在线观看精品| 污污污污污污www网站免费| 少妇高清精品毛片在线视频| 黄色小视频免费网站| 国产91视频一区| 天天色综合社区| 欧美极品欧美精品欧美| av免费一区二区| 欧美综合在线观看视频| 肉大捧一出免费观看网站在线播放 | 久色视频在线播放| 91视频这里只有精品| 国产一二三在线视频| 黄色永久免费网站| www.爱色av.com| 五月天激情图片| 永久av免费在线观看| 久久这里只有精品23| 爱豆国产剧免费观看大全剧苏畅| 99re99热| 性久久久久久久久久久久久久| 精品人妻大屁股白浆无码| 性猛交ⅹ×××乱大交| www黄色日本| 久久久性生活视频| 欧美人成在线观看| 日本老太婆做爰视频| 日韩成人精品视频在线观看| 国产真实乱子伦| 日韩在线视频在线观看| 日韩一区二区高清视频| 中文字幕超清在线免费观看| 麻豆三级在线观看| 天堂在线资源视频| 116极品美女午夜一级| 奇米影视亚洲色图| 国产精品免费看久久久无码| 精品一区二区成人免费视频| 国模私拍视频在线观看| 奇米影视四色在线| 福利片一区二区三区| 蜜桃免费在线视频| 牛夜精品久久久久久久| 在线观看国产一级片| 日韩av在线中文| 91香蕉视频网址| 日韩小视频网站| koreanbj精品视频一区| 男人舔女人下面高潮视频| 黄色高清无遮挡| 亚洲成人福利在线| 日本黄色a视频| 免费人成在线观看视频播放| 秋霞无码一区二区| www黄色日本| 欧美一级xxxx| 国产www免费| 99久久激情视频| 超碰97免费观看| 欧美激情亚洲天堂| 成人在线观看黄| 天天爱天天做天天操| 和岳每晚弄的高潮嗷嗷叫视频| 成人免费在线网| 亚洲欧美自拍另类日韩| 日本成人性视频| 97成人在线免费视频| av亚洲天堂网| 精品久久久久久久久久中文字幕| www.69av| 波多野结衣天堂| 全黄性性激高免费视频| 日本人视频jizz页码69| 日本精品福利视频| 色哟哟精品视频| 老太脱裤让老头玩ⅹxxxx| 亚洲18在线看污www麻豆| 男人的天堂狠狠干| 欧洲xxxxx| 亚洲人视频在线| 日韩欧美在线播放视频| 国产精品无码免费专区午夜| 亚洲xxx在线观看| 成年人免费在线播放| 国产女人18毛片| 亚洲精品永久视频| 国模杨依粉嫩蝴蝶150p| 黄色一级片在线看| av日韩在线看| 黄色一级视频播放| 国产亚洲视频一区| 欧美成人黄色网址| 成人在线观看黄| 99久热在线精品视频| 国产在线播放观看| 午夜免费高清视频| www.四虎成人| 中文字幕色呦呦| 中文字幕在线视频一区二区| 波多野结衣天堂|