最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年04月05日 09:32:36   作者:瘋狂的技術宅  
這篇文章主要給大家介紹了關于Node.js事件的正確使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Node.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

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

事件的好處

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

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

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

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

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

一個例子

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

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

module.exports = myEmitter;

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

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);

附加一個監(jiān)聽器的單獨模塊:

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 也可以被重復使用,它可以被附加到發(fā)送相同消息的其他事件上(用戶對象)。同樣重要的是 當多個 listener 被附加到單個事件時,它們將按照附加的順序同步執(zhí)行。因此 someOtherListener 將在 sendEmailOnRegistration 完成執(zhí)行后運行。

但是,如果你希望自己的 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 )的一部分將會繼續(xù)被外部對象( emitter )引用,所以存在內存泄漏的可能。

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

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);
 }
}

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

注意事項

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

總結

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

相關文章

  • 我的Node.js學習之路(一)

    我的Node.js學習之路(一)

    這是一篇專門Node.js初學者學習筆記。該筆記將通過具體實例,教你一步步開始Node.js之旅。
    2014-07-07
  • 簡單聊一聊Node.js參數max-old-space-size

    簡單聊一聊Node.js參數max-old-space-size

    簡單的說Node.js就是運行在服務端的JavaScript,下面這篇文章主要給大家介紹了關于Node.js參數max-old-space-size的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Node.js中的模塊化,npm包管理器詳解

    Node.js中的模塊化,npm包管理器詳解

    這篇文章主要介紹了node模塊與npm包管理工具,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • 一文教會你從Windows中完全刪除node.js

    一文教會你從Windows中完全刪除node.js

    作為新手nodejs卸載后安裝就總出錯,下面這篇文章主要給大家介紹了關于如何從Windows中完全刪除node.js的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Node.js之構建WebSocket服務全過程

    Node.js之構建WebSocket服務全過程

    這篇文章主要介紹了Node.js之構建WebSocket服務全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • nodejs簡單實現中英文翻譯

    nodejs簡單實現中英文翻譯

    這篇文章主要介紹了nodejs簡單實現中英文翻譯的方法和示例,雖然還存在著不小的問題,但是也算是基本能用了,這里推薦給大家。
    2015-05-05
  • Node.js數據庫操作之查詢MySQL數據庫(二)

    Node.js數據庫操作之查詢MySQL數據庫(二)

    這篇文章主要介紹了Node.js數據庫操作之查詢MySQL數據庫的相關資料,文中介紹的非常詳細,對大家學習或者使用mysql能帶來一定的幫助,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • node.js實現簡單爬蟲示例詳解

    node.js實現簡單爬蟲示例詳解

    這篇文章主要為大家介紹了node.js實現簡單爬蟲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Nodejs實現用戶注冊功能

    Nodejs實現用戶注冊功能

    本文通過實例代碼給大家介紹了Nodejs實現用戶注冊功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • ChatGPT編程秀之最小元素的設計示例詳解

    ChatGPT編程秀之最小元素的設計示例詳解

    這篇文章主要為大家介紹了ChatGPT編程秀之最小元素的設計示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

德化县| 麟游县| 松溪县| 靖宇县| 简阳市| 金沙县| 新和县| 资中县| 遂昌县| 通江县| 木里| 灵武市| 左贡县| 巴林右旗| 望谟县| 新竹县| 易门县| 濮阳县| 滕州市| 富川| 临沧市| 金门县| 通州市| 柞水县| 和静县| 华容县| 新乡县| 丘北县| 克什克腾旗| 临沂市| 邻水| 容城县| 嘉兴市| 西吉县| 扎赉特旗| 休宁县| 原阳县| 鄄城县| 明水县| 会同县| 东明县|