在事件發布端移除所有事件訂閱

2021-07-24 02:11:21 字數 2821 閱讀 8471

通常都是在事件訂閱端註冊和取消註冊的,比如說

事件發布端:

public class publisher

else}}

事件訂閱端:

public class subscriber

public void unsubscribesomeevent(publisher publisher)

public void onsomeevent(object arg1, object arg2)

", this.gettype().name);}}

如果有一堆訂閱事件的:

public class subscriber1 : subscriber 

public class subscriber2 : subscriber

public class subscriber3 : subscriber

public class subscriber4 : subscriber

public class subscriber5 : subscriber

//...

先寫點**執行一下:

publisher publisher = new publisher();

subscriber1 subscriber1 = new subscriber1();

subscriber2 subscriber2 = new subscriber2();

subscriber3 subscriber3 = new subscriber3();

subscriber4 subscriber4 = new subscriber4();

subscriber5 subscriber5 = new subscriber5();

subscriber1.subscribesomeevent(publisher);

subscriber2.subscribesomeevent(publisher);

subscriber3.subscribesomeevent(publisher);

subscriber4.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

publisher.firesomeevent();

其中5號訂閱者重複訂閱了多次事件。

執行結果:

如果說這群訂閱者還都不主動取消訂閱事件,(據說)就會造成記憶體洩漏或者相關的物件無法釋放等問題。

但是如果訂閱者都比較分散,東乙個西乙個的,找起來不一定能找的到,如果釋放事件發布端,可能會帶來一定問題(別問我會帶來啥問題也別問我為啥要釋放事件發布端,我不知道

如果說在事件發布端有個方法能夠「清除」掉所有事件訂閱豈不很爽?

那麼只需要在事件發布端加上這麼乙個方法(方法來自 stackoverflow 最後乙個回答):

public void unsubscribeallsomeevent()}}

來測試一下:

publisher publisher = new publisher();

subscriber1 subscriber1 = new subscriber1();

subscriber2 subscriber2 = new subscriber2();

subscriber3 subscriber3 = new subscriber3();

subscriber4 subscriber4 = new subscriber4();

subscriber5 subscriber5 = new subscriber5();

subscriber1.subscribesomeevent(publisher);

subscriber2.subscribesomeevent(publisher);

subscriber3.subscribesomeevent(publisher);

subscriber4.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

subscriber5.subscribesomeevent(publisher);

publisher.firesomeevent();

publisher.unsubscribeallsomeevent();

console.writeline();

console.writeline("all subscribers unsubscribed some event");

console.writeline();

publisher.firesomeevent();

測試結果:

可見是有效的。不知道為啥那個回答被人踩了。。

input text所有事件

text 物件事件 onblur 當 text field失去聚焦的時候執行一些 onchange 當 text field失去聚焦並且它的值發生變動的時候執行一些 onclick 當使用者在 text field中用滑鼠左鍵點選時執行一些 onfocus 當 text field獲得聚焦的時候執行...

JavaScript事件發布 訂閱

1 發布 訂閱模式也是諸多設計模式當中的一種 2 這種方式可以在es5下相當優雅地處理非同步操作 3 什麼是發布 訂閱呢?我們舉個栗子 假設fn1,fn2,fn3都可以視作乙個事件的發布者,執行它,就會發布乙個事件。這個時候,我們可以通過乙個事件的訂閱者去批量訂閱並處理這些事件,包括它們的先後順序。...

訂閱發布模式 事件

實現訂閱發布模式的基本思路 訂閱者把自己想訂閱的事件註冊到排程中心,所以第一步應該先實現訂閱者到排程中心的方法。訂閱方法 排程中心統一排程訂閱者註冊到排程中心的處理 發布方法 訂閱者取消訂閱事件 取消訂閱方法 直接附上 var pubsub one function evt,fn,ctx off f...