javascript訂閱模式淺析和基礎實例

前言

最近在開發redux或者vux的時候,狀態管理當中的createStore,以及我們在組件中調用的dispatch傳遞消息給狀態管理中心,去處理一些操作的時候,有些類似我們常見到訂閱模式

於是寫了一個小demo去實現了一下訂閱模式的過程

思路

訂閱模式類似某個平台的作者,或者UP主,而平台充當了一個中間件傳遞消息的作用,作者是發布訂閱的人,在被關注或者訂閱了之後,發布的消息,收聽作者的用戶,可以收到作者發布的消息

  • 創建平台
var Messege = function () {
  this.list = {};
  this.cache = {};
};
  • 創建完成平台之後,平台的作者自己創建內容,發布消息
Messege.prototype.add = function (noticeType, client) {
  // 將收到的資訊加入到noticeType訂閱列表當中
  console.log(noticeType);
  console.log(client);

  if (!this.list[noticeType]) this.list[noticeType] = [];
  this.list[noticeType].push(client);
  this.cache[noticeType].forEach((words) => {
    client.listen(noticeType, words);
  });
};
  • 同時還能刪除自己已經發布的消息
// 通過傳入的資訊類型,遍歷查找
Messege.prototype.remove = function (noticeType, client) {
  if (!this.list[noticeType]) return; //可以作為提示或者說處理符合業務需求的操作
  var index = this.list[noticeType].findIndex((item) => item === client);
  console.log(this.list[noticeType].splice(index, 1));
  this.list[noticeType].splice(index, 1);
};

在發布了這些往期列表當中,以及訂閱了up主的訂閱者,可以通過往期消息查看以前發布過的文章資訊列表

  • 此時需要一個快取去存儲以及發布過的資訊,充當一個歷史記錄的角色
Messege.prototype.triggle = function (noticeType, words) {
  if (!this.cache[noticeType]) this.cache[noticeType] = [];
  this.cache[noticeType].push(words);

  if (!this.list[noticeType]) return;
  this.list[noticeType].forEach((client) => {
    client.listen(noticeType, words);
  });
};
  • 訂閱對象實例化,我們可以實例化對象中,去處理一些需要執行的業務需求
var Client = function (name) {
  this.name = name;
};

// 監聽事件,事件處理邏輯
Client.prototype.listen = function (noticeType, words) {
  console.log(`${this.name}收到${noticeType}的資訊是:${words}`);
};
  • 完成了發布者的功能之後,我們就可以自己測試發布一些消息
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>訂閱模式</title>
</head>
<body>
</body>
<script src="./subscribe.js"></script>
<script>
    var client1 = new Client('client1')
    var client2 = new Client('client2')
    var messege = new Messege()
    // messege.add('新消息01', client1)
    // messege.remove('新消息01', client1)
    messege.triggle('新消息02', "這是一段消息01");
    messege.triggle('新消息02', "這是一段消息02"); 

    var client3 = new Client('client3');
    messege.add('新消息03', client3);
    messege.add('新消息03', client3);
    messege.remove('新消息03', client3);
</script>
</html>

通過實例化對象,實例化訂閱資訊之後,可以實現頁面或者組件之間,相應的一些狀態更改和數據之間的傳遞。

以上是javascript訂閱模式的淺析

源碼地址:

// githup倉庫地址
//github.com/akari16/FunctionRealization

文章個人部落格地址:javascript訂閱模式淺析和基礎實例,歡迎訂閱