ClojureScript-assoc在promise中不起作用

时间:2019-02-22 12:01:03

标签: clojurescript

我有各种各样的艺术品。我想找到路线长度,并将其与每个艺术品相关联。

我的代码如下:

msi

路由长度计算正确,但是assoc无法正常工作。它实际上不是关联它。我不知道问题是什么。谁能帮我吗?

2 个答案:

答案 0 :(得分:0)

请简化此示例!在此过程中,您将发现问题。

首先,更新您的问题,使其包含显示requirep/map等的p/error。另外,将map-request放在load-art-routes之前,就像它必须在源文件中一样。

然后,您应该从删除线程最后的->>运算符开始,并使用let作为中间值的名称:

(let [aa (map-request ...)
      bb (p/map (fn [data] ...)   aa)
      cc (p/error (fn [error] ...) bb) ]
  <bb or cc here?> )

我怀疑您的p/error通话吞没了p/map的结果并返回了nil

答案 1 :(得分:0)

这似乎是您在尝试编写“可变”代码。

重新格式化代码并修复一个错误使这一点更加明显:

(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之后调用的回调的东西。