JavaScript 中的訂閱發布模式就好比一家報社,報社負責發行各種新聞,而訂閱了該報社的讀者可以隨時獲得最新的新聞。這一示例形象地表明了訂閱發布的機制:發布者負責生成消息并將其發布到特定的頻道上,而訂閱者則注冊到這些頻道上,并在有消息發布時接收到通知。
使用 JavaScript 實現發布訂閱機制的一種方法是使用觀察者對象。觀察者是一個對象,它包含了訂閱消息的方法以及在收到通知時要執行的邏輯。下面是一個發布訂閱的簡單示例:
var pubsub = {}; (function(q) { var topics = {}, subUid = -1; // 發布或廣播事件給訂閱者 q.publish = function(topic, args) { if(!topics[topic]) { return false; } var subscribers = topics[topic], len = subscribers ? subscribers.length : 0; while(len--) { subscribers[len].func(topic, args); } return this; }; // 為訂閱者提供一個標識符并向主題數組中添加訂閱者 q.subscribe = function(topic, func) { if(!topics[topic]) { topics[topic] = []; } var token = (++subUid).toString(); topics[topic].push({ token: token, func: func }); return token; }; // 從特定主題的訂閱列表中取消訂閱 q.unsubscribe = function(token) { for(var m in topics) { if(topics[m]) { for(var i = 0, j = topics[m].length; i < j; i++) { if(topics[m][i].token === token) { topics[m].splice(i, 1); return token; } } } } return false; }; })(pubsub);
在上面的代碼中,我們創建了一個 pubsub 對象,它包含了發布、訂閱和取消訂閱的方法。topics 對象用于存儲所有的主題及其訂閱者。接下來,我們可以創建一個訂閱者并進行訂閱:
var testHandler = function(topic, data) { console.log(topic + ": " + data); } var testSubscription = pubsub.subscribe("example", testHandler); pubsub.publish("example", "hello world"); pubsub.unsubscribe(testSubscription);
在上面的代碼中,首先我們創建了一個訂閱者 testHandler,然后使用 subscribe 方法,讓它訂閱了 "example" 主題。接著我們使用 publish 方法發布了一個 "example" 主題的消息 "hello world"。最后,我們使用 unsubscribe 方法取消了訂閱。
這一簡單的發布訂閱模式示例可以擴展應用到復雜的系統中,例如應用程序間的消息傳遞或增強模塊之間的通信。