[英]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中加載它時會發生什么。
第一次加載頁面:“無法在* THIS LINE *上讀取屬性'getContext'的null”。 這是因為尚未設置devcard畫布。
如果我做了一個毫無意義的更改並保存文件,代碼重新加載並正常工作。 這是因為已經設置了devcard canvas。
很明顯這是(a)當(主)運行和(b)devcard's:canvas設置之間的競爭條件。
我該如何解決? 理想情況下,我想在畫布上標記“在此之后運行主要功能......”
好的,我想出來了。
最簡單的解決方案(即不涉及破解devcard /試劑)是每隔50ms進行一次單獨的cljs / go線程檢查以查看元素是否存在,如果存在,則執行該函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.