waitingForNext

suspend fun <E : Event> waitingForNext(id: String = randomIdStr(), key: Event.Key<E>, matcher: ContinuousSessionEventMatcher<E> = ContinuousSessionEventMatcher): E

挂起并等待下一个符合 类型条件事件 对象。

val session: ContinuousSessionContext = ...

session.waitingForNext(id, FooEvent) { event -> // this: EventProcessingContext
// ...
true
}

如果注册时发现存在 id 冲突的持续会话监听函数,则上一个函数将会被立即关闭处理。

超时处理

使用 withTimeout 或其衍生函数来进行超时控制。

val session: ContinuousSessionContext = ...

withTimeout(5.seconds) {
session.waitingForNext(id, FooEvent) { event -> // this: EventProcessingContext
// ...
true
}
}

目标类型

当使用事件类型参数 key 的时候,建议使用明确、具体的类型对象,如下示例:

session.waitingForNext(id, FriendMessageEvent) { ... }

不建议使用通过事件的 Event.key 属性参数而得到的实例。因为在事件处理过程中,你所得到的事件对象是经过层层实现与包装的, 你无法保证通过 Event.key 的具体类型,进而可能导致一系列不可控问题。

比如如下示例中:

                            + -------- +
+ --> | BarEvent |
| + -------- +
+ -------- + |
| FooEvent | ---- +
+ -------- + |
| + -------- +
+ --> | TarEvent |
+ -------- +

FooEvent 事件有两个实现:BarEventTarEvent

如果你的监听函数为:

suspend fun listener(event: FooEvent, session: ContinuousSessionContext) {
session.waitingForNext(key = event.key) { true }
}

那么此时,你通过 waitingForNext 所能得到的事件类型很有可能只能是 BarEventTarEvent 中的 某一种,而并非所有可能的 FooEvent

Parameters

id

持续会话监听函数的唯一标识。

key

所需监听函数的类型。

Throws

CancellationException

被终止关闭时


suspend fun waitingForNext(id: String = randomIdStr(), matcher: ContinuousSessionEventMatcher<Event> = ContinuousSessionEventMatcher): Event

挂起并等待下一个符合 条件事件 对象。

相当于:

waitingForNext(id, Event.Root, matcher)

See also

Throws

CancellationException

被终止时