簡體   English   中英

事件驅動的編程-node.js,Java

[英]Event-driven programming - node.js, Java

我來自Java,但是最近一直在做一些Node.js,並且一直在研究Node中的EventEmitter模塊。

我不了解事件驅動的編程和“常規”編程之間的根本區別。

這是一些偽代碼,以演示我對“事件驅動”編程的想法。

EventEmitter ee = new EventEmitter();
Function f = new SpecialFunction();

ee.on('grovel',f);

ee.emit('grovel'); //calls function 'f'

EventEmitter對象似乎唯一要做的工作是在事件的String表示形式(在本例中為“ grovel”)和一個響應函數之間創建哈希關系。 似乎就是這樣,那里沒有太多魔術。

但是,我的問題是-事件驅動型編程如何真正在諸如鼠標單擊和鍵入之類的低級事件發生后進行工作? 換句話說,我們如何在程序中單擊並轉換為字符串(例如“ grovel”)?

好的。 我將對此進行嘗試。

使用事件發射器有兩個主要原因。

主要原因之一是JavaScript誕生的瀏覽器有時會迫使您這樣做。 無論您是使用jQuery還是其他框架/庫等將事件直接連接到HTML中,底層代碼都基本相同(erm,基本上...)

因此,首先,如果您想對鍵盤或鼠標事件做出反應(如前所述),則可以將硬綁定直接綁定到事件處理程序(回調),如下所示:

<div onclick="myFunc(this)">Click me</div>

...或者您可以通過DOM引用在JS中做完全相同的事情:

document.getElementById('my_element').onclick = function (evt) {
    alert('You clicked me');
};

這曾經是我們連接點擊處理程序的主要方式。 這種模式的致命缺陷在於,您只能將一個回調附加到每個DOM事件。 如果要讓第二個回調對同一事件做出反應,則需要將其組合到現有的單擊處理程序中,或者需要構建一個委托函數來處理調用這兩個函數的工作。 另外,事件發射器最終與事件偵聽器緊密耦合,這通常是一件壞事。

隨着應用程序變得越來越復雜,使用事件偵聽器變得更加有意義。 瀏覽器供應商(最終)選擇了一種單一的方法來做到這一點:

// Build the handler
var myHandler = function (evt) {
    alert('You clicked me too');
    window.myHandlerRef = this; // Watch out! See below.
};

// Bind the handler to the DOM event
document.getElementById('my_element').addEventListener('click', myHandler);

這種模式的優勢在於,您可以將多個處理程序附加到一個DOM事件,或者從幾個不同的DOM事件中調用一個事件處理程序。 缺點是您必須注意不要泄漏:根據事件的編寫方式,事件處理閉包(如上面的myHandler )在銷毀它們並附加了GC的DOM元素后可以繼續存在。 這意味着最好始終執行removeEventListener('click', myHandler) (某些庫具有執行相同操作的off()方法)。

此模式也適用於鍵盤事件:

var giveUserAHeadache = function (evt) {
    alert('Annoying, isn\'t it?');
};

document.addEventListener('keypress', giveUserAHeadache);

好的。 因此,這通常就是處理本機瀏覽器事件的方式。 但是開發人員也喜歡在自己的代碼中使用這種事件委托模式。 您想要這樣做的原因是,您可以盡可能地使代碼解耦。

例如,在用戶界面中,每次用戶的瀏覽器離線時,您可能會navigator.onLine一個事件(例如,您可能會觀看navigator.onLine )。 也許頁面標題上的綠色/紅色指示燈會顯示在線狀態,並且可能在脫機時禁用所有提交按鈕,也可能在頁面頁腳中顯示警告消息。 使用事件偵聽器/發射器,您可以將所有這些編寫為完全解耦的模塊,並且它們仍可以按步進行工作。 而且,如果您需要重構UI,則可以刪除一個組件(例如,燈),將其替換為其他組件,而不必擔心會弄亂其他模塊中的邏輯。

再舉一個例子,在Node應用程序中,您可能希望您的數據庫代碼向特定的控制器發出錯誤情況並記錄錯誤-並發送電子郵件。 您可以看到這些事情是如何迭代添加的。 使用事件偵聽器,這種事情很容易實現。

您可以編寫自己的代碼,也可以使用特定環境中可用的任何模式。 jQuery,Angular,Ember和Node都有其特定的方法,但是您可以自由地構建自己的方法,這是我鼓勵您嘗試的方法。

這些都是同一基本思想的變體,確切的定義或最正確的實現存在很多模糊(實際上,有些人可能會質疑這些是否根本不同)。 但是,這是主要的罪魁禍首:

  1. 觀察
  2. 發布-訂閱
  3. 中間人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM