- Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。
- 使用场景如下:B页面需要感知到A页面的点击事件,进而触发B页面的刷新逻辑,类似这种公共的事件通知,就可通过 emitter 来实现。
1. Emitter的开发步骤
1.1 导入 emitter 模块
- 发布和订阅都需要导入 emitter 模块。
import { emitter } from '@kit.BasicServicesKit';
1.2 订阅事件 emitter.on
import { promptAction } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
const TAG: string = 'ThreadModel';
const DOMAIN_NUMBER: number = 0xFF00;
// 定义一个eventId为1的事件
let event: emitter.InnerEvent = {
eventId: 1
};
// 收到eventId为1的事件后执行该回调
let callback = (eventData: emitter.EventData): void => {
promptAction.showToast({
message: JSON.stringify(eventData)
});
hilog.info(DOMAIN_NUMBER, TAG, 'event callback:' + JSON.stringify(eventData));
};
// 订阅eventId为1的事件
emitter.on(event, callback);
promptAction.showToast({
message: JSON.stringify('emitter subscribe success')
});
1.3 发送事件 emitter.emit
// 定义一个eventId为1的事件,事件优先级为Low
let event: emitter.InnerEvent = {
eventId: 1,
priority: emitter.EventPriority.LOW
};
let eventData: emitter.EventData = {
data: {
content: 'c',
id: 1,
isEmpty: false
}
};
// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);
2. @ohos.events.emitter (Emitter)
2.1 emitter.on
- 持续订阅某个事件以及接收事件的回调处理。订阅自定义事件。
- emitter.on(event: InnerEvent 1 , callback: Callback): void
@State postInfoList: Array<PostInfo> = [new PostInfo(this.init_post)]
@StorageProp('token') @Watch('onTokenChange') token: string = ''
@State page: number = 1
@State total: number = 0
async getPostInfoPage() {
let response = await getAllPost({
page: this.page,
size: 10
})
response.records.forEach(item => {
this.postInfoList.push(item)
})
this.total = response.total
this.page += 1
}
refresh() {
this.postInfoList = []
this.total = 0
this.page = 1
this.getPostInfoPage()
}
aboutToAppear(): void {
if (this.token) {
this.getPostInfoPage()
}
emitter.on({ eventId: 1 }, () => {
this.refresh()
})
}
onTokenChange() {
if (this.token) {
this.getPostInfoPage()
} else {
this.postInfoList = []
this.total = 0
this.page = 1
}
}
2.2 emitter.once
- 单次订阅某个事件以及接收事件的回调处理,接收到回调处理后自动取消订阅。
- emitter.once(event: InnerEvent 1 , callback: Callback): void
2.3 emitter.off
- 取消订阅某个事件。
- emitter.off(eventId: number): void
2.4 emitter.emit
emitter.emit({
eventId: 1,
priority: emitter.EventPriority.IMMEDIATE
})
InnerEvent 订阅或发送的事件,订阅事件时EventPriority不生效。
{
eventId: number, 事件的ID,由开发者定义用来辨别事件。
priority: emitter.EventPriority 3
} ↩︎ ↩︎ ↩︎EventData 发送事件时传递的数据。类型为 [key: string]: any。 ↩︎
EventPriority 用于表示事件被发送的优先级.
IMMEDIATE(0):表示事件被立即投递。
HIGH(1):表示事件先于LOW优先级投递。
LOW(2):表示事件优于IDLE优先级投递,事件的默认优先级是LOW。
IDLE(3):表示在没有其他事件的情况下,才投递该事件。 ↩︎