ClojureScript,Figwheel,Devcards,Race Condition

时间:2016-10-27 21:15:10

标签: clojure

这是我最小的失败案例。

(ns hello
  (:require-macros [devcards.core :as dc])
  (:require [reagent.core :as r]
            [devcards.core :as dc]
            [gamma.api :as g]
            [gamma.program :as p]
            [goog.dom :as gdom]
            [goog.webgl :as ggl]))


(defn main []
  (let [canvas (.getElementById js/document "webgl")
        gl (.getContext canvas "webgl")] ;; *** THIS LINE ***
    (.clearColor gl 0.0 0.0 0.0 1.0)
    (.clear gl gl.COLOR_BUFFER_BIT)))


(dc/defcard-rg canvas-example
  [:div
   [:canvas {:width 600
             :height 600
             :id "webgl"}]])


(main)

当我在figwheel / devcard中加载它时会发生什么。

  1. 首次加载页面:“无法在 * THIS LINE * 上读取属性'getContext'为null”。这是因为尚未设置devcard画布。

  2. 如果我进行无意义的更改并保存文件,代码会重新加载并正常工作。这是因为已经设置了devcard canvas。

  3. 很明显,这是(a)(主要)运行时和(b)设置devcard's:canvas之间的竞争条件。

  4. 我该如何解决这个问题?理想情况下,我想在画布上标记“在此之后运行主要功能......”

1 个答案:

答案 0 :(得分:0)

好的,我想出来了。

最简单的解决方案(即不涉及破解devcard /试剂)是每隔50ms进行一次单独的cljs / go线程检查以查看该元素是否存在,如果存在,则执行该函数。