首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClojureScript - assoc不是在承诺中工作

ClojureScript - assoc不是在承诺中工作
EN

Stack Overflow用户
提问于 2019-02-22 20:01:03
回答 2查看 62关注 0票数 0

我有一系列的艺术品。我想找出路线长度,并将其与每个艺术作品联系起来。

我的代码将如下所示:

代码语言:javascript
复制
(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)
(defn map-request [params]
 (when params
   (let [endpoint google-directions-api-endpoint]
     (->> (make-get-req (str endpoint "&" (encode-query-params params))
                        {})
          (p/map (fn [data]
                   (util/log "GOOGLE DIRECTIONS API " data)
                   data))
          (p/error (fn [error]
                     (util/log (str "GOOGLE DIRECTIONS API ERRORS" params ) error)
                     ))))))

路由长度计算是正确的,但是assoc不工作。它实际上并没有关联它。我不知道问题出在哪里。有谁可以帮我?

EN

回答 2

Stack Overflow用户

发布于 2019-02-22 22:34:36

请简化这个例子!在此过程中,您会发现问题所在。

首先,更新您的问题以包含显示p/mapp/error等是什么的require。此外,将map-request放在load-art-routes之前,就像它必须在源文件中一样。

然后,您应该从删除线程最后一个->>操作符开始,并使用带有中间值名称的let

代码语言:javascript
复制
(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

票数 0
EN

Stack Overflow用户

发布于 2019-02-23 19:08:20

这看起来像是你在尝试编写“可变”代码。

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

代码语言:javascript
复制
(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,并开始promises中的一些工作。这些承诺只更新它们的列表版本,但是考虑到我们使用的是不可变的数据结构,返回的art-list本身保持不变。p/error调用中是否还有可疑的第二个art-list

您可能希望将其重新构造为返回一个Promise或接受一个回调,该回调在计算完所有route-length后将被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54826662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档