Просмотр исходного кода

enhance: use p/delay to yield to ensure ui db updated before resolve

Tienson Qin 3 недель назад
Родитель
Сommit
3729b88a12
2 измененных файлов с 13 добавлено и 21 удалено
  1. 8 7
      src/main/frontend/common/async_util.cljc
  2. 5 14
      src/main/frontend/db/transact.cljs

+ 8 - 7
src/main/frontend/common/async_util.cljc

@@ -6,14 +6,15 @@
                      [logseq.common.util :as common-util]
                      [promesa.core :as p])))
 
-#?(:cljs
-   (defn throw-err
-     [v]
-     (if (instance? ExceptionInfo v) (throw v) v)))
+(comment
+  #?(:cljs
+     (defn throw-err
+       [v]
+       (if (instance? ExceptionInfo v) (throw v) v)))
 
-(defmacro <?
-  [port]
-  `(throw-err (cljs.core.async/<! ~port)))
+  (defmacro <?
+    [port]
+    `(throw-err (cljs.core.async/<! ~port))))
 
 #?(:cljs
    (defn c->p

+ 5 - 14
src/main/frontend/db/transact.cljs

@@ -1,25 +1,16 @@
 (ns frontend.db.transact
   "Provides async transact for use with ldb/transact!"
-  (:require [clojure.core.async :as async]
-            [clojure.core.async.interop :refer [p->c]]
-            [frontend.common.async-util :include-macros true :refer [<?]]
-            [frontend.state :as state]
+  (:require [frontend.state :as state]
             [frontend.util :as util]
-            [lambdaisland.glogi :as log]
             [logseq.outliner.op :as outliner-op]
             [promesa.core :as p]))
 
 (defn worker-call
   [request-f]
-  (let [response (p/deferred)]
-    (async/go
-      (let [result (<? (p->c (request-f)))]
-        (if (:ex-data result)
-          (do
-            (log/error :worker-request-failed result)
-            (p/reject! response result))
-          (p/resolve! response result))))
-    response))
+  (p/let [result (request-f)]
+    ;; yields to ensure ui db to be updated before resolved
+    (p/delay 0)
+    result))
 
 (defn transact [worker-transact repo tx-data tx-meta]
   (let [tx-meta' (assoc tx-meta