假設我們有一個Channel這樣的
private val channel = Channel<String>(1)
我們正在聆聽這樣的Channel元素
channel.receiveAsFlow().collect { myStr ->
println(myStr)
}
如果我運行這樣的事情
private val scope = CoroutineScope(Dispatchers.Main SupervisorJob())
...
fun sendMessage(myMessage: String) {
scope.launch {
channel.send(myMessage)
}
}
...
sendMessage("a")
sendMessage("b")
sendMessage("c")
sendMessage("d")
輸出將是
a
b
c
d
現在,我想要實作的是,如果我發送"b"它會將通道中元素的處理延遲 1 秒。
例如,如果我這樣做
...
sendMessage("a")
sendMessage("b")
sendMessage("c")
sendMessage("b")
sendMessage("d")
sendMessage("e")
我期望的輸出會像
a // prints immediately
b // prints right after a
c // prints after 1 second
b // prints right after c
d // prints after 1 second
e // prints right after d
我的問題是,我將如何實作這種行為?我一直在嘗試在delay()這里和那里添加,但我沒有任何運氣。
uj5u.com熱心網友回復:
這是一個想法,但對我來說有點hacky。trySend不適用于此。我不確定如何使trySend您的標準有意義,因為它應該立即回傳有關是否發布值的結果。
在這里,send()暫停直到可能的延遲結束。如果您不想等待,則每次發送內容時都必須啟動協程。
由于 Channel “建構式”不是真正的建構式,因此您不能將其子類化。我的解決方法是創建一個將其用作委托的類。
val backingChannel = Channel<String>(1)
val channel = object: Channel<String> by backingChannel {
var delayNext = false
val mutex = Mutex()
override suspend fun send(element: String) = mutex.withLock {
if (delayNext) {
delay(1000)
}
delayNext = element == "b"
backingChannel.send(element)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411476.html
標籤:
