2016-10-27 36 views
1

这是我最小的失败案例。ClojureScript,Figwheel,Devcards,Race Condition

(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. 第一次加载页面:上*此行* “无法读取属性 '的getContext' 空的”。这是因为devcard画布尚未设置。

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

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

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

回答

0

好的,我明白了这一点。

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