亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Node.js事件的正確使用方法

2019-11-19 11:52:32
字體:
來源:轉載
供稿:網友

前言

事件驅動的編程變得流行之前,在程序內部進行通信的標準方法非常簡單:如果一個組件想要向另外一個發送消息,只是顯式地調用了那個組件上的方法。但是在 react 中用的卻是事件驅動而不是調用。

事件的好處

這種方法能夠使組件更加分離。在我們繼續寫程序時,會識別整個過程中的事件,在正確的時間觸發它們,并為每個事件附加一個或多個事件監聽器,這使得功能擴展變得更加容易。我們可以為特定事件添加更多的 listener,而不必修改現有的偵聽器或觸發事件的應用程序部分。我們所談論的是觀察者模式。

設計一個事件驅動的體系結構

對事件進行識別非常重要,我們不希望最終必須從系統中刪除或替換現有事件,因為這可能會迫使我們刪除或修改附加到事件上的眾多偵聽器。我的一般原則是僅在業務邏輯單元完成執行時才考慮觸發事件。

假如你想在用戶注冊后發送一堆不同的電子郵件。注冊過程本身可能會涉及許多復雜的步驟和查詢,但從商業角度來看,這只是其中的一個步驟。每個要發送的電子郵件也是單獨的步驟。因此,一旦注冊完成馬上就發布事件是很有意義的。于是我們附加了多個監聽器,每個監聽器負責發送一種類型的電子郵件。

Node的異步事件驅動架構具有一些被稱為“emitters”的對象。它們發出命名事件,這些事件會調用被稱為“listener”的函數。發出事件的所有對象都是 EventEmitter 類的實例。使用它,我們可以創建自己的事件:

一個例子

讓我們使用內置的 events 模塊(我建議你查看這個文檔:https://nodejs.org/api/events...)以獲取對 EventEmitter 的訪問權限。

const EventEmitter = require('events');const myEmitter = new EventEmitter();module.exports = myEmitter;

這是我們的服務器端程序的一部分,它負責接收HTTP請求,保存新用戶并發出事件:

const myEmitter = require('./my_emitter');// Perform the registration steps// Pass the new user object as the message passed through by this event.myEmitter.emit('user-registered', user);

附加一個監聽器的單獨模塊:

const myEmitter = require('./my_emitter');myEmitter.on('user-registered', (user) => { // Send an email or whatever.});

將策略與實現分開是一種非常好的做法。在這種情況下,策略意味著哪些 listener 訂閱了哪些事件。實現意味著 listener 自己。

const myEmitter = require('./my_emitter');const sendEmailOnRegistration = require('./send_email_on_registration');const someOtherListener = require('./some_other_listener');myEmitter.on('user-registered', sendEmailOnRegistration);myEmitter.on('user-registered', someOtherListener);
module.exports = (user) => { // Send a welcome email or whatever.}

這種分離使 listener 也可以被重復使用,它可以被附加到發送相同消息的其他事件上(用戶對象)。同樣重要的是 當多個 listener 被附加到單個事件時,它們將按照附加的順序同步執行。因此 someOtherListener 將在 sendEmailOnRegistration 完成執行后運行。

但是,如果你希望自己的 listener 以異步方式運行,只需用 setImmediate 包裝它們的實現,如下所示:

module.exports = (user) => { setImmediate(() => { // Send a welcome email or whatever. });}

讓你的 Listeners 保持簡潔

在寫 listener 時要堅持單一責任原則。一個 listener 應該只做一件事并把事情做好。例如:要避免在 listener 中編寫太多的條件并根據事件傳來的數據(消息)去決定做什么。在這種情況下使用不同的事件會更加合適:

const myEmitter = require('./my_emitter');// Perform the registration steps// The application should react differently if the new user has been activated instantly.if (user.activated) { myEmitter.emit('user-registered:activated', user); } else { myEmitter.emit('user-registered', user);}
const myEmitter = require('./my_emitter');const sendEmailOnRegistration = require('./send_email_on_registration');const someOtherListener = require('./some_other_listener');const doSomethingEntirelyDifferent = require('./do_something_entirely_different');myEmitter.on('user-registered', sendEmailOnRegistration);myEmitter.on('user-registered', someOtherListener);myEmitter.on('user-registered:activated', doSomethingEntirelyDifferent);view raw

必要時明確分離 Listener

在前面的例子中,我們的 listener 是完全獨立的函數。但是在 listener 與對象關聯的情況下(這時是一種方法),必須手動將其從已訂閱的事件中分離出來。否則對象將永遠不會被垃圾回收,因為對象( listener )的一部分將會繼續被外部對象( emitter )引用,所以存在內存泄漏的可能。

例如,如果我們正在開發一個聊天程序,并且希望當新消息到達用戶進入的聊天室時,顯示通知的功能應該位于該用戶對象本身的內部,我們可能會這樣做:

class ChatUser {  displayNewMessageNotification(newMessage) { // Push an alert message or something. }  // `chatroom` is an instance of EventEmitter. connectToChatroom(chatroom) { chatroom.on('message-received', this.displayNewMessageNotification); } disconnectFromChatroom(chatroom) { chatroom.removeListener('message-received', this.displayNewMessageNotification); }}

當用戶關閉他的標簽或暫時斷開互聯網連接時,我們可能希望在服務器端發起一個回調,通知其他用戶有人剛剛下線。當然在這時為脫機用戶調用 displayNewMessageNotification 沒有任何意義。除非我們刪除它,否則它將繼續被用于調用新消息。如果不這樣做,除了不必要的調用之外,用戶對象也會被永久地保留在內存中。因此在用戶脫機時應該在服務器端回調中調用 disconnectFromChatroom。

注意事項

如果不小心,即便是松散耦合的事件驅動架構也會導致復雜性的增加,可能會導致在系統中跟蹤依賴關系變得很困難。如果我們從偵聽器內部發出事件,程序會特別容易出現這類問題。這可能會觸發意外的事件鏈。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕九色91在线| 欧日韩不卡在线视频| 欧美日韩一区二区三区在线免费观看| 福利一区福利二区微拍刺激| 欧美日韩国产中文字幕| 亚洲乱码av中文一区二区| 久久精品人人做人人爽| 亚洲午夜未删减在线观看| 2025国产精品视频| 日日骚久久av| 尤物九九久久国产精品的特点| 国产精品青草久久久久福利99| 日韩女优人人人人射在线视频| 国产精品久久久久久久久久小说| 欧美美女15p| 91九色蝌蚪国产| 538国产精品视频一区二区| 国产精品扒开腿做爽爽爽视频| 日韩精品久久久久久久玫瑰园| 日韩欧美中文第一页| 国产男人精品视频| 欧美激情视频一区二区| 一二美女精品欧洲| 91亚洲国产成人久久精品网站| 亚洲美女av电影| 日韩精品在线观看一区二区| 狠狠操狠狠色综合网| 色综合亚洲精品激情狠狠| 性亚洲最疯狂xxxx高清| 欧美综合一区第一页| 亚洲国产欧美在线成人app| 亚洲国产免费av| 少妇av一区二区三区| 97视频com| 亚洲天堂av网| 欧美高清不卡在线| 精品一区二区亚洲| 国产亚洲精品高潮| 国产一区二区三区毛片| 亚洲大胆人体在线| 色悠悠国产精品| 夜夜嗨av色一区二区不卡| 亚洲美女黄色片| 国产精品久久久久久影视| 不卡av在线播放| 国产精品h在线观看| 欧美日韩在线视频一区二区| 精品久久久一区二区| 日韩的一区二区| 欧美日韩精品二区| 欧美一级大片在线免费观看| 国产日韩欧美影视| 91精品国产综合久久香蕉最新版| 欧美黄色片在线观看| 黑人与娇小精品av专区| 国产精品r级在线| 国产一区二区色| 欧美日韩高清区| 成人日韩av在线| 欧美日韩国产二区| 在线看日韩欧美| 午夜精品一区二区三区在线播放| 中文字幕欧美专区| 欧美激情视频一区二区| 欧美精品国产精品日韩精品| 成人性生交大片免费看小说| 亚洲有声小说3d| 日韩av一区在线观看| 国产91精品视频在线观看| 伊人男人综合视频网| 最近免费中文字幕视频2019| 亚洲高清一二三区| 成人中文字幕+乱码+中文字幕| 精品视频久久久久久久| 欧美丰满少妇xxxx| 欧美在线视频在线播放完整版免费观看| 亚洲精品一区av在线播放| 最近2019中文字幕第三页视频| 欧美日韩在线免费观看| 国产一区二区三区18| 欧美大片免费观看| 久久久天堂国产精品女人| 91久久久亚洲精品| 人人爽久久涩噜噜噜网站| 亚洲风情亚aⅴ在线发布| 91精品久久久久久久久中文字幕| 日韩久久午夜影院| 欧美成人免费小视频| 国产在线观看不卡| 欧美激情在线观看| 97视频免费在线看| 日韩精品免费电影| 日韩av免费在线播放| 色噜噜久久综合伊人一本| 亚洲老板91色精品久久| 中文字幕精品国产| 91在线观看免费观看| 久久人人爽人人爽爽久久| 国产日韩欧美在线| 日韩精品有码在线观看| 北条麻妃一区二区三区中文字幕| 日韩高清有码在线| 亚洲新中文字幕| 在线观看不卡av| 97国产精品视频人人做人人爱| 日韩在线视频观看| 一区二区三区高清国产| 亚洲国产小视频在线观看| 国产91精品久久久| 国产精品欧美激情| 欧美亚洲另类视频| 亚洲欧美综合v| 欧美午夜激情视频| 欧美中文字幕视频在线观看| 国产亚洲日本欧美韩国| 亚洲精品久久久久中文字幕二区| 亚洲网站在线播放| 亚洲自拍高清视频网站| 永久免费精品影视网站| 精品国内自产拍在线观看| 成人网中文字幕| www.亚洲免费视频| 欧美日韩在线免费| 亚洲欧美在线一区二区| 久久久亚洲网站| 亚洲国产欧美一区二区三区同亚洲| 亚洲第一天堂av| 日韩美女免费观看| 亚洲аv电影天堂网| 精品美女国产在线| 精品久久久久久久久久| 国产日韩中文字幕| 亚洲国产欧美久久| 成人在线视频福利| 91精品视频专区| 亚洲黄页网在线观看| 亚洲自拍偷拍网址| 在线观看国产精品日韩av| 九九热精品视频| 欧美xxxx做受欧美.88| 91av视频在线播放| 最近2019年好看中文字幕视频| 久久精品国产91精品亚洲| 欧美一级黑人aaaaaaa做受| 久久久久女教师免费一区| 亚洲欧洲一区二区三区久久| 懂色aⅴ精品一区二区三区蜜月| 国产97人人超碰caoprom| 亚洲黄页视频免费观看| 在线日韩日本国产亚洲| 欧美在线不卡区| 久久久久久久亚洲精品| 国产精品第一区| 欧美国产精品va在线观看| 日韩在线播放视频| 久久精品成人一区二区三区| 精品国产一区二区三区久久| 欧美最猛黑人xxxx黑人猛叫黄| 欧美激情久久久久久| 久久精品成人动漫| 亚洲天堂av综合网| 久久精品成人一区二区三区| 91超碰caoporn97人人| 欧美激情精品久久久久久大尺度|