[英]using coroutines for debouncing
有一個 function updateData(id:String, data: Any?)
,它將對id
進行一些數據更新。 只想使用最后一個數據進行更新,如果此調用是針對相同id
的調用太快一個接一個,則應丟棄前一個。
private var _lastId = ""
private var _lastCallJob: Job? = null
private fun debouncingUpdateData(id: String, data: Any?) {
if (_lastId == id) {
_lastCallJob?.cancel()
_lastCallJob = launch {
delay(20)
updateData(id, data)
}
} else {
_lastId = id
_lastCallJob = launch {
delay(20)
updateData(id, data)
}
}
}
此實現將取消先前啟動的_lastCallJob
(未完成,很可能仍在等待 20 milsec),前提是 id 相同。
但它不適用於 id = "1", id="2", id="3" 之類的情況
所以當像這樣打電話時:
debouncingUpdateData("1", data)
debouncingUpdateData("2", data)
debouncingUpdateData("1", data)
id==="1" 的第三次調用可能仍會消失(即使第一次調用仍在 20 milsec 延遲范圍內),因為_lastId
已更改為“2”。
有更好的方法來使用協程進行去抖動嗎?
不確定是否有一些更簡單的庫 function,但似乎這對多個id
情況進行了去抖動
private val idToJobMap = HashMap<String, Job>()
private fun debouncingUpdateData(id: String, data: Any?) {
idToJobMap[id]?.let { job ->
job.cancel()
}
idToJobMap[id] = launch {
delay(20)
idToJobMap.remove(id)
updateData(data)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.