我正在创建一个WebSocket类来接收一些数据,并且试图将Flowable与FlowableEmitter一起使用来接收套接字响应。
我想保留发射器,并且每次接收到onNext调用的数据并处理结果时,如果我在每个flowable中都进行订阅,则可以正常工作,但是如果我在以后使用FlatMap发送另一条消息,则无法工作第一个可流动的接收数据。
我创建一个发射器列表:
var listEmitter: MutableList<FlowableEmitter<*>> = mutableListOf()
然后我创建一个函数来注册观察者:
inline fun <reified T> onMessage(data: ByteString?): Flowable<T> {
return Flowable.create<T>({ emitter ->
listEmitter.add(emitter)
//send the data to socket
data?.let { socket?.send(data) }
}, BackpressureStrategy.LATEST)
}
当我从套接字接收数据时,我打电话:
//I called [0] here to demonstrate the logic only
((listEmitter[0].subscriber) as FlowableEmitter<Any>).onNext(true)
在演示者中,我尝试做类似的事情:
socket
.onMessage(/*some ByteString*/)
.flatMap {
if (it) {
socket.onMessage(/*other data*/)
} else {
Flowable.just(false)
}
}.flatMap {
if (it) {
socket.onMessage(/*other data*/)
} else {
Flowable.just(false)
}
}.subscribe { /* do some stuff */}
因此只有第一个FlatMap被触发,第二个和第三个不再触发,我在正确的发射器上调用onNext,但是什么也没发生,调用了onNext,不调用FlatMap。
我在“ onMessage”上发送的数据具有标识符,因此在WebSocketConnection中,我知道正确的发射器,但为简单起见,我在这里没有这样做
我不确定为什么不起作用,也不知道如何存档。我只想在第一个收到结果后才发送onMessage。