waitingForNext
suspend fun <E : Event> waitingForNext(id: String = randomIdStr(), key: Event.Key<E>, matcher: ContinuousSessionEventMatcher<E> = ContinuousSessionEventMatcher): E(source)
val session: ContinuousSessionContext = ...
session.waitingForNext(id, FooEvent) { event -> // this: EventProcessingContext
// ...
true
}
Content copied to clipboard
如果注册时发现存在 id 冲突的持续会话监听函数,则上一个函数将会被立即关闭处理。
超时处理
使用 withTimeout 或其衍生函数来进行超时控制。
val session: ContinuousSessionContext = ...
withTimeout(5.seconds) {
session.waitingForNext(id, FooEvent) { event -> // this: EventProcessingContext
// ...
true
}
}
Content copied to clipboard
目标类型
当使用事件类型参数 key 的时候,建议使用明确、具体的类型对象,如下示例:
session.waitingForNext(id, FriendMessageEvent) { ... }
Content copied to clipboard
不建议使用通过事件的 Event.key 属性参数而得到的实例。因为在事件处理过程中,你所得到的事件对象是经过层层实现与包装的, 你无法保证通过 Event.key 的具体类型,进而可能导致一系列不可控问题。
比如如下示例中:
+ -------- +
+ --> | BarEvent |
| + -------- +
+ -------- + |
| FooEvent | ---- +
+ -------- + |
| + -------- +
+ --> | TarEvent |
+ -------- +
Content copied to clipboard
FooEvent
事件有两个实现:BarEvent
和 TarEvent
。
如果你的监听函数为:
suspend fun listener(event: FooEvent, session: ContinuousSessionContext) {
session.waitingForNext(key = event.key) { true }
}
Content copied to clipboard
那么此时,你通过 waitingForNext 所能得到的事件类型很有可能只能是 BarEvent
或 TarEvent
中的 某一种,而并非所有可能的 FooEvent
。
Parameters
id
持续会话监听函数的唯一标识。
key
所需监听函数的类型。
Throws
被终止关闭时
suspend fun waitingForNext(id: String = randomIdStr(), matcher: ContinuousSessionEventMatcher<Event> = ContinuousSessionEventMatcher): Event(source)
相当于:
waitingForNext(id, Event.Root, matcher)
Content copied to clipboard