core async debounce

This commit is contained in:
Weihua Lu
2021-07-20 14:32:18 +08:00
parent 95ccf083ad
commit e3410d5f2f
2 changed files with 32 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
(ns frontend.extensions.zotero
(:require [cljs.core.async :refer [<! go]]
(:require [cljs.core.async :refer [<! >! go chan]]
[clojure.string :as str]
[frontend.extensions.zotero.api :as api]
[frontend.extensions.zotero.handler :as zotero-handler]
@@ -38,18 +38,18 @@
(let [[term set-term!] (rum/use-state "")
[search-result set-search-result!] (rum/use-state [])
[search-error set-search-error!] (rum/use-state nil)
[is-searching set-is-searching!] (rum/use-state false)]
[is-searching set-is-searching!] (rum/use-state false)
term-chan (chan)
debounce-chan (api/debounce term-chan 500)]
(rum/use-effect!
(fn []
(let [do-search (fn [] (when-not (str/blank? term)
(go
(let [result (<! (api/query-items "journalArticle" term))]
(set-search-result! result)))))
do-search (util/debounce 200 do-search)]
(do-search)))
(go
(let [term (<! debounce-chan)]
(when-not (str/blank? term)
(set-search-result!
(<! (api/query-items "journalArticle" term)))))))
[term])
@@ -59,7 +59,9 @@
[:input.p-2.border.block.w-full.mb-3
{:autoFocus true
:placeholder "Search for your Zotero journal article (title, author, text, anything)"
:value term :on-change (fn [e] (set-term! (util/evalue e)))}]
:value term :on-change (fn [e]
(set-term! (util/evalue e))
(go (>! term-chan (util/evalue e))))}]
[:div
(map

View File

@@ -1,6 +1,7 @@
(ns frontend.extensions.zotero.api
(:require [cljs-http.client :as http]
[cljs.core.async :refer [go <!]]
[cljs.core.async
:refer [go <! >! go-loop timeout close! chan alt!]]
[camel-snake-kebab.core :as csk]
[camel-snake-kebab.extras :as cske]
[frontend.util :as util]))
@@ -14,6 +15,24 @@
:type :user
:type-id 8234867})
;; taken from https://github.com/metosin/metosin-common/blob/master/src/cljc/metosin/core/async/debounce.cljc
(defn debounce
"Creates a channel which will change put a new value to the output channel
after timeout has passed. Each value change resets the timeout. If value
changes more frequently only the latest value is put out.
When input channel closes, the output channel is closed."
[in ms]
(let [out (chan)]
(go-loop [last-val nil]
(let [val (if (nil? last-val) (<! in) last-val)
timer (timeout ms)]
(alt!
in ([v] (if v
(recur v)
(close! out)))
timer ([_] (do (>! out val) (recur nil))))))
out))
;; "/users/475425/collections?v=3"
(defn get*
([config api]