取消订阅事件
FastEvent提供了灵活的事件取消订阅机制,支持多种取消方式。你可以取消特定事件的订阅、特定监听器的订阅,或者取消所有订阅。同时,还支持按作用域清理订阅,以及清除保留的事件。
快速入门
使用订阅对象取消
typescript
// 订阅事件时保存返回的订阅对象
const subscriber = event.on("user/login", (message) => {
console.log("用户登录:", message.payload);
});
// 使用订阅对象取消订阅
subscriber.off();推荐
推荐使用订阅对象取消订阅,可以避免误操作
使用 off 方法取消
typescript
const listener = (message) => {
console.log("收到消息:", message.payload);
};
// 订阅事件
event.on("chat/message", listener);
// 取消特定事件的特定监听器
event.off("chat/message", listener);取消所有订阅
typescript
// 取消所有事件订阅
event.offAll();指南
订阅器
on/once/onAny方法会返回一个订阅对象:
ts
export type FastEventSubscriber = {
off: () => void;
listener: FastEventListener<any, any, any>;
};推荐采用订阅对象取消订阅,可以避免误操作:
ts
const subscriber = event.on("chat/message", listener);
subscriber.off(); off 方法
off()方法是最基本的取消订阅方法,支持多种调用方式:
- 取消特定事件的特定监听器:
typescript
const subscriber = event.on("chat/message", listener);
event.off("chat/message", subscriber.listener);特别注意:
以上方法有时可能如预期取消订阅,因为内部有可能会对listener函数进行二次包装,因此off()方法可能无法取消订阅。
优先采用以下方式进行退订:
ts
const subscriber = event.on("chat/message", listener);
subscriber.off(); 也可以使用以下方法:
const subscriber = event.on('chat/message', listener);
event.off('chat/message',
subscriber.listener // [!code ++]
);- 取消特定事件的所有监听器:
typescript
event.off("chat/message");- 取消特定监听器的所有事件订阅:
typescript
event.off(listener);offAll 方法
offAll()方法用于批量取消订阅,支持可选的前缀参数:
- 取消所有事件订阅:
typescript
event.offAll();- 取消特定前缀的所有事件订阅:
typescript
// 取消所有以'user/'开头的事件订阅
event.offAll("user");特性说明:
- 会清除指定范围内的所有监听器
- 不会影响其他范围的监听器
- 适合批量清理特定模块或功能的事件订阅
clear 方法
clear()方法不仅会取消订阅,还会清除保留的事件:
typescript
// 清除所有订阅和保留的事件
event.clear();
// 清除特定前缀的订阅和保留的事件
event.clear("user");特性说明:
- 同时清除订阅和保留的事件
- 支持按前缀清除
- 适合完全重置特定范围的事件系统
提示
clear和offAll的区别在于,clear会清除保留的事件消息,而offAll不会.
条件取消订阅
FastEvent支持在订阅时指定off参数,用于在接收到满足条件的消息时自动取消订阅。
ts
import { FastEvent } from "fastevent";
const emitter = new FastEvent();
emitter.on(
"click",
(message, args) => {
console.log(message);
},
{
off: (message, args) => {
return message.payload === "exit";
},
},
);
emitter.emit("click", "1");
emitter.emit("click", "exit");- 以上示例将在接收到
payload=exit消息时自动取消订阅。
自动取消订阅
FastEvent实现了Symbol.dispose特性,支持在离开作用域时自动取消订阅。
ts
const emitter = new FastEvent();
const events: string[] = [];
{
using subscriber = emitter.on("test", ({ type }) => {
events.push(type);
});
emitter.emit("test");
// 有一个订阅者
expect(emitter.getListeners("test").length).toBe(1);
} // 离开作用域
emitter.emit("test"); // 此时已经没有订阅者了
expect(events).toEqual(["test"]);
expect(events.length).toBe(1);
// 已经取消订阅了,所以没有订阅者
expect(emitter.getListeners("test").length).toBe(0);