事件匯流排提供了一個強大的發布-訂閱機制,允許您的 blocklet 內部,甚至跨不同 blocklet(在同一個 ABT Node 實例內)的元件以解耦的方式相互通訊。這非常適合用於廣播全系統的狀態變更或事件,而不需要元件之間有直接的依賴關係。
通知服務 是設計用於向使用者發送有針對性的訊息,而事件匯流排則是設計用於內部的、元件對元件的通訊。
運作原理
事件匯流排促進了一個非同步通訊流程:
- 一個 發布者 元件發送一個帶有特定名稱和負載的事件。
- Blocklet SDK 將此事件發送到在 ABT Node 中運行的中央事件匯流排服務。
- 事件匯流排服務接著將此事件廣播給所有正在監聽該事件類型的 訂閱者 元件。
此過程在下圖中視覺化呈現:

API 參考
publish
將一個事件發布到事件匯流排,使其對所有已訂閱的監聽器可用。這是一個非同步操作。
參數
- name
string(required) — 事件的名稱,例如 user.created 或 order.shipped。 - event
object(required) — 一個包含事件詳細資訊的物件。- id
string— 事件的唯一 ID。如果未提供,將會自動生成一個。 - time
string— 事件發生時的 ISO 8601 時間戳。預設為當前時間。 - data
object(required) — 事件的主要負載。它可以包含任何可 JSON 序列化的資料。此物件中的 object_type 和 object_id 欄位將被提升到頂層事件物件中,以便於篩選。
- id
範例
發布使用者建立事件
import eventbus from '@blocklet/sdk/service/eventbus';
async function createUser(userData) {
// ... 在資料庫中建立使用者的邏輯
const newUser = { id: 'user_123', name: 'John Doe' };
try {
await eventbus.publish('user.created', {
data: {
object_type: 'User',
object_id: newUser.id,
object: newUser,
source_system: 'admin_panel',
},
});
console.log('使用者建立事件發布成功。');
} catch (error) {
console.error('發布事件失敗:', error);
}
return newUser;
}subscribe
註冊一個回呼函式,以便在從事件匯流排收到事件時執行。請注意,一個元件不會收到它自己發布的事件。
參數
- cb
(event: TEvent) => void(required) — 一個回呼函式,當收到事件時,將會以事件物件作為參數來調用它。
事件物件結構 (TEvent)
回呼函式接收單一參數:事件物件。此物件具有基於 CloudEvents 規範的標準化結構。
- id
string(required) — 事件實例的唯一識別碼。 - source
string(required) — 發布事件的元件的 DID。 - type
string(required) — 事件的名稱(例如 user.created)。 - time
string(required) — 事件建立時的 ISO 8601 時間戳。 - spec_version
string(required) — CloudEvents 規範版本,例如 '1.0.0'。 - object_type
string— 事件資料中主要物件的類型(例如 User)。 - object_id
string— 事件資料中主要物件的 ID。 - data
object(required) — 事件的詳細負載。- type
string— 資料的內容類型,預設為 'application/json'。 - object
any— 實際的資料負載。 - previous_attributes
any— 對於更新事件,這可能包含變更前物件的狀態。
- type
範例
訂閱事件
import eventbus from '@blocklet/sdk/service/eventbus';
const handleEvent = (event) => {
console.log(`收到類型為 ${event.type} 的事件`);
console.log('事件詳情:', event);
if (event.type === 'user.created') {
console.log(`一個新使用者已建立,ID 為:${event.object_id}`);
// 更新 UI 或執行其他操作
}
};
eventbus.subscribe(handleEvent);
console.log('正在從事件匯流排監聽事件...');unsubscribe
移除先前註冊的事件監聽器。在元件卸載或不再需要監聽事件時調用此函式至關重要,以防止記憶體洩漏。
參數
- cb
(event: TEvent) => void(required) — 傳遞給 subscribe 的完全相同的回呼函式引用。
範例
為了正確取消訂閱,您必須保留對原始回呼函式的引用。
完整的訂閱生命週期
import eventbus from '@blocklet/sdk/service/eventbus';
// 1. 定義處理函式
const onUserEvent = (event) => {
console.log(`收到使用者事件:${event.type}`);
};
// 2. 訂閱事件匯流排
eventbus.subscribe(onUserEvent);
console.log('已訂閱使用者事件。');
// ... 在應用程式生命週期的後期(例如,元件卸載時)
// 3. 使用相同的函式引用取消訂閱
eventbus.unsubscribe(onUserEvent);
console.log('已取消訂閱使用者事件。');