Функция 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) выполняется, потому что это в ложной ветви. Проверьте когда, который имеет только истинную ветвь.

Другие вопросы по тегам