2016-10-27 2 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.

  3. Понятно, что это условие гонки между (а), когда выполняется (main), и (b) при установке devcard's: canvas.

  4. Как это исправить? В идеале я хочу пометить что-то на холсте, сказав: «Запустите главную функцию после этого ...»

ответ

0

Хорошо, я понял это.

Простейшее решение (т. Е. Не требует взлома devcard/reagent) состоит в том, чтобы просто иметь отдельную проверку потока cljs/go каждые 50 мс, чтобы увидеть, существует ли элемент, и если это так, выполните функцию.

Смежные вопросы