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一区二区
www.污污视频| www.成年人| 欧美伦理片在线看| 天天插天天操天天射| 亚欧美一区二区三区| 91香蕉视频污版| 久久男人资源站| 男女激情免费视频| 日本中文字幕精品—区二区| 天堂…中文在线最新版在线| 毛片av在线播放| 青青在线视频观看| 亚洲高清在线不卡| 国产精品无码人妻一区二区在线| www在线观看免费| 欧美日韩一区二区在线免费观看| 久久撸在线视频| 欧美精品 - 色网| 日韩精品一区二区三区久久| 亚洲精品性视频| 人妻少妇精品无码专区二区| 日本久久久久久久久久久久| 成人性生交视频免费观看| 欧美日韩亚洲国产成人| 992tv人人草| 黄色高清无遮挡| 日韩av新片网| 99久久久精品视频| 中文字幕日韩久久| 污色网站在线观看| 成人在线观看a| 亚洲精品蜜桃久久久久久| 污污的视频免费观看| 凹凸国产熟女精品视频| 久激情内射婷内射蜜桃| 人妻av无码专区| 亚洲熟妇无码av在线播放| 久久久成人精品一区二区三区| 蜜臀av免费观看| 老汉色影院首页| www.偷拍.com| 免费看污污视频| www成人免费| 黄色网页免费在线观看| 欧美一区二区三区爽大粗免费| 日韩小视频网站| 黑森林福利视频导航| 国产精品69页| 久久国产精品国产精品| 成人在线免费观看视频网站| 天堂8在线天堂资源bt| 日韩一级片一区二区| 777av视频| 超碰在线公开97| 国产日本在线播放| 永久av免费在线观看| 国产一二三四区在线观看| 91动漫在线看| 青青草原av在线播放| 中文字幕线观看| 日本精品一区在线观看| 国产精品自在自线| 亚洲人成无码网站久久99热国产| 国产免费裸体视频| 日韩在线不卡一区| 高清在线观看免费| 亚洲天堂第一区| 国内自拍视频网| 两根大肉大捧一进一出好爽视频| 午夜免费精品视频| 免费拍拍拍网站| 欧美日韩午夜爽爽| 久久久久久久久久一区| 国产精品少妇在线视频| 成人在线免费观看视频网站| 91福利免费观看| 三上悠亚在线一区| 在线观看亚洲色图| 成年人网站大全| 亚洲国产精品三区| 黄色片久久久久| 国产精品久久久久9999小说| 亚洲熟妇无码一区二区三区导航| 艳母动漫在线免费观看| 亚洲综合在线一区二区| 久久久成人精品一区二区三区| 九九九九九九九九| 五月天色婷婷综合| 亚洲综合伊人久久| 黄色小视频大全| 日韩a∨精品日韩在线观看| www.亚洲天堂网| 亚洲欧美激情网| 僵尸世界大战2 在线播放| 成人小视频在线观看免费| 国产 福利 在线| 日本不卡一区二区在线观看| 国产日产欧美一区二区| 欧美国产亚洲一区| 九九热精品国产| 国产乱子伦农村叉叉叉| 午夜免费看毛片| 97超碰人人澡| 欧美 亚洲 视频| 超碰av在线免费观看| 日本77777| 99久久国产宗和精品1上映| 精品一区二区三区毛片| 中文字幕视频在线免费观看| 97碰在线视频| 欧美国产视频一区| 亚洲精品永久视频| 十八禁视频网站在线观看| 97在线国产视频| 97在线免费视频观看| 青娱乐国产精品视频| 国产专区在线视频| 视色,视色影院,视色影库,视色网| 成人免费视频久久| www黄色av| 男人天堂成人在线| 狠狠热免费视频| 蜜臀视频一区二区三区| 青青青在线视频免费观看| 99久久久无码国产精品6| 国产成人精品视频ⅴa片软件竹菊| 亚洲美免无码中文字幕在线 | 欧美 日韩 国产 在线观看 | 三级黄色片免费看| 亚洲18在线看污www麻豆| 97超碰人人爽| 51xx午夜影福利| 青青草成人免费在线视频| 人人妻人人澡人人爽欧美一区双| 欧美日韩中文字幕在线播放| 黄色一级视频片| 天天综合网久久| 久久这里只有精品23| 无人在线观看的免费高清视频| 免费日韩中文字幕| 黄色免费网址大全| 免费看日本黄色| 激情综合网婷婷| 毛片在线视频观看| www.com操| 蜜臀av性久久久久蜜臀av| 日本熟妇人妻xxxxx| 久久香蕉视频网站| 91女神在线观看| 亚洲国产精品久久久久婷蜜芽 | 一级片免费在线观看视频| 日本一本中文字幕| 在线视频一二区| www.-级毛片线天内射视视| 最新中文字幕免费视频| 欧美大黑帍在线播放| 国产欧美自拍视频| 亚洲五码在线观看视频| 五月天婷婷影视| 亚洲xxxx2d动漫1| 99福利在线观看| 91看片就是不一样| 美女av免费在线观看| 国产91视频一区| 国产免费一区二区三区四在线播放| 国产免费视频传媒| 91最新在线观看| 超碰在线97免费| 天天操天天爱天天爽| 天堂av在线网站| 影音先锋成人资源网站| 日本三日本三级少妇三级66| www.欧美激情.com| 99精品视频网站| 日韩a∨精品日韩在线观看| www.com毛片| 日本黄色福利视频| 精品一区二区三区毛片| 春日野结衣av| 欧美成人福利在线观看| 午夜在线视频免费观看| 无码专区aaaaaa免费视频| 久久精品影视大全| 久久亚洲精品无码va白人极品| av免费中文字幕| 国产手机视频在线观看| 精品国产免费av| 日韩视频在线免费播放| 精品久久久噜噜噜噜久久图片| 韩国日本美国免费毛片| www插插插无码免费视频网站| 亚洲这里只有精品| 熟妇熟女乱妇乱女网站| 男女曰b免费视频| 免费看一级大黄情大片| 欧美少妇一区二区三区| 一区二区三区韩国| 能在线观看的av| 日本xxxxxxx免费视频| 成人免费毛片网|