Kotlin 监听器内部监听器

Kotlin 监听器内部监听器,kotlin,coroutine,kotlinx.coroutines,Kotlin,Coroutine,Kotlinx.coroutines,我正在尝试为听众创建制作人。 我的代码如下所示 suspend fun foo() = produce{ someEvent.addListener { this.send(it) } } 但是我发现,只有在协同程序中才能调用error暂停函数,这是有意义的。我的问题是。有没有一种方法可以使用协同程序实现此模式?有几种方法可以实现它,具体取决于您试图实现的目标: 如果您只想接收最近的事件,那么您应该使用一个合并的频道和offer方法,该方法始终成功: fun f

我正在尝试为听众创建
制作人
。
我的代码如下所示

suspend fun foo() = produce{
    someEvent.addListener {
        this.send(it)
    }
}

但是我发现,只有在协同程序中才能调用error
暂停函数,这是有意义的。我的问题是。有没有一种方法可以使用协同程序实现此模式?

有几种方法可以实现它,具体取决于您试图实现的目标:

如果您只想接收最近的事件,那么您应该使用一个合并的频道和
offer
方法,该方法始终成功:

fun foo() = produce<T>(capacity = Channel.CONFLATED) {
    someEvent.addListener {
        offer(it)
    }
}
如果您的生产者支持明确的背压信号(如功能性反应流),那么您应该使用一个特殊的适配器将其背压信号正确地传输到/从协程传输。
kotlinx.coroutines
库中有许多现成的集成模块,其中包含用于此目的的各种反应式库。看

注意:您不应使用
suspend
修饰符标记
foo
函数。调用
foo
无论如何都不会挂起调用程序。它只是立即(同步)启动一个生产者协同程序


要了解更多关于协同程序和各种频道的信息,我强烈建议您学习。

感谢您提供了详尽的答案:)第一个解决方案:在我调用侦听器时,频道已经关闭,我没有关闭它。“频道已关闭”。你能帮我理解为什么吗?我为此提出了一个问题:
fun foo() = produce<T>() {
    someEvent.addListener {
        runBlocking { send(it) }
    }
}
fun foo() = produce<T>(capacity = Channel.UNLIMITED) {
    someEvent.addListener {
        offer(it)
    }
}