私はClojureScript内でファイルプリローダーを作成しようとしています。私の考えでは、このようなパターンだった:ClojureScriptファイルプリローダー - 約束をエミュレートする関数またはパターン?
(def urls (atom[]))
(def loaded-resources (atom []))
(def all-resources (promise))
(defn loading-callback []
(if (= (count urls) (count loaded-resources))
(deliver all-resources loaded-resources)))
;; fill urls array
;; start ajax-loading with loading-callback on success
それがリソースを必要として、Clojureの中でうまく機能している、彼らのために待ってまで、だから私の主な機能は上に行くことができます。
ClojureScriptには約束が存在しないので、どうすれば問題を回避できますか? core.asyncチャンネルに基づいてCLJSに約束してくれるpromesaがありますが、私の必要性を満たしていない単一の機能が実行されるのを待つ将来のような約束しかできません(少なくとも私が昨日考えていた方法で...)。
この問題を解決するための提案はありますか?たぶん完全に違ったパターンを使うのでしょうか?私はCLJ/Sを試してみるために、私のチームの人々を説得するために、コードをできるだけシンプルに保っていきたいと思います。
EDIT:アランの二アイデア後
:
一方私は優れているバージョンcore.async
(def urls (atom []))
(def loaded-resources (atom []))
(def resource-chan (chan))
(defn loading-callback [data]
(go (>! resource-chan data)))
;; fill url array from main
(load! []
;; init ajax loading
(go-loop []
(when-not (= (count @loaded-resources) (count @urls))
(swap! loaded-resources conj (<! resource-chan))
(recur)))
わからない使用しようとした
(def urls (atom[]))
(def loaded-resources (atom []))
(defn loading-callback [data]
(swap! loaded-resources conj data))
(defn load! [post-loading-fn]
(add-watch loaded-resources :watch-loading
(fn [_ _ _ cur]
(if (= (count cur) (count @urls)) (post-loading-fn))))
;; init ajax loading
)
(defn init []
;; fill urls array
(load! main))
(main []
(do-terrific-stuff @loaded-resources))
。
'goog.Promise'を使って' googでそれらを押してください。Promise.all' – ClojureMostly
興味深い提案、とにかくGoogleのフレームワークがインポートされるように...私はまだそれを試していないが、アイデアにこだわりました@アラン - トンプソンは私を与えて、すべてが完了したらローディングフック。それは私の必要性のために非常にうまくいく。 – waechtertroll
あなたが可変状態を扱い、あなたのロジックにバグがないことに依存しているので、それはまた悪い考えです。これはまさにgoog.Promise.allが作られたものです。 javascriptのコーダーでもそのコードを理解できます。それはフロントエンド開発の非常に一般的なパターンです! – ClojureMostly