Вот мой минимальный случай отказа.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.
Первый раз загрузки страницы: "Не удается прочитать свойство 'getContext' нуль" на * ЭТОЙ *. Это связано с тем, что холст devcard еще не настроен.
Если я делаю бессмысленное изменение и сохраняю файл, код перезагружается и работает нормально. Это связано с тем, что был создан экран devcard.
Понятно, что это условие гонки между (а), когда выполняется (main), и (b) при установке devcard's: canvas.
Как это исправить? В идеале я хочу пометить что-то на холсте, сказав: «Запустите главную функцию после этого ...»