簡體   English   中英

使用協程去抖動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM