Похоже, что вы пытаетесь написать "изменяемый" код.
Переформатирование кода и исправление одной ошибки делает это более очевидным:
(defn load-art-routes [art-list ctx]
(doall (map-indexed (fn [index art]
(let [user-location (select-keys (:coords (sub> ctx :geolocation)) [:latitude :longitude])
art-location (:geoLocation art)]
(->> (map-request {:origin (str (:latitude user-location) "," (:longitude user-location))
:destination (str (:lat art-location) "," (:lon art-location))
:mode (name (sub> ctx :transition-mode))})
(p/map (fn [data]
(let [route-length (ocall js/Math "round" (/ (get-in data [:routes 0 :legs 0 :distance :value]) (* 0.621371192 1000)) 2)
route-duration (ocall js/Math "floor" (/ (get-in data [:routes 0 :legs 0 :duration :value]) 60))]
(js/console.log "load-art-routes route-length " route-length)
(assoc art :route-length route-length))))
(p/error (fn [error]
(util/log (str " GOOGLE DIRECTIONS API ERRORS " params) error)
))))) art-list))
art-list)
load-art-routes
просто возвращает оригиналart-list
и пинки какой-то работы в обещаниях.Эти обещания только обновляют свои версии списка, но, учитывая, что мы используем неизменяемые структуры данных, возвращаемые art-list
сами остаются неизменными.Есть также подозрительная секунда art-list
в вызове p/error
?
Возможно, вы захотите реструктурировать это так, чтобы оно возвращало Promise или принимало обратный вызов, который будет вызван один раз для всех route-length
были вычислены.