mirror of
https://github.com/logseq/logseq.git
synced 2026-05-29 23:19:38 +00:00
core async debounce
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user