Функция ClojureScript всегда выполняется
Я изучаю ClojureScript, у меня есть две функции, которые просто меняют содержимое в div "root-app":
(ns blog.core)
(defn mount-components []
(let [content (js/document.getElementById "root-app")]
(while (.hasChildNodes content)
(.removeChild content (.-lastChild content)))
(.appendChild content (js/document.createTextNode "Wilkommen zu mein
ekelhaft blog!!"))))
(defn init! []
(def current_url js/window.location.href)
(if (clojure.string/includes? current_url "about")
(.log js/console (str "Whatever URL ->>>" js/window.location.href))
(mount-components)))
Все отлично работает в http://localhost:3000/about, потому что на этой странице есть div "root-app", но в http://localhost:3000/blog я получаю сообщение об ошибке:
Потому что на этой странице нет такого div. Все это странно, потому что похоже, что ClojureScript действительно обнаруживает, что:
(if (clojure.string/includes? current_url "about")
фактически неверно в файле console.log не печатается.
У меня вопрос: почему функция mount-components запускается и отправляет сообщение об ошибке, даже если условный if равен false? Странная вещь в том, что console.log:
(.log js/console (str "Whatever URL ->>>" js/window.location.href))
не запускается, но работает функция mount-components. Думаю, я не понимаю "последовательность" в том, как работает ClojureScript.
2 ответа
Я не уверен, но по вашему описанию я думаю, что логика, о которой вы думаете, и логика, которую вы на самом деле тестируете, не совпадают. Ваш оператор if ищет слово "about" в URL. Если он есть, он печатает журнал консоли, т.е. он будет там для http://localhost:300/about. Если его там нет, он запустит функцию mount-components, которая ищет идентификатор div, который, как вы говорите, не указан на странице, поэтому вы получите сообщение об ошибке. Компоненты mount являются оператором ELSE и поэтому выполняются, когда тест ложен.
if
форма работает как (if cond true-branch false-branch)
, Так что ваши (mount-component)
выполняется, потому что это в ложной ветви. Проверьте когда, который имеет только истинную ветвь.