【发布时间】:2018-12-03 23:44:26
【问题描述】:
我正在使用 clojurescript 和 localforage 一个基于承诺的存储库。我在 localstorage 中设置了如下结构作为键值对
"names" : ["name1","name2","name3"]
每个“名称”都是另一组值的键。
"name1": [val1,val2,val3]
我目前正处于拥有名称列表的位置,现在需要遍历该列表,获取每个名称的值,然后返回格式如下的地图:
{:name1 [val1,val2,val3] :name2 [val1,val2]}
为此,我想出了以下sn-p:
(defn get-project-dates [project-map]
"Handles getting all the times/dates for project"
(loop [i 0
project-dates {}]
(if (= i (count project-map))
project-dates
(.then (.getItem localforage (nth project-map i)) (fn [promiseVal]
(recur (inc i) (conj project-dates {(key (nth project-map i)) promiseVale})))))))
不幸的是,这不起作用,因为它不是 recur 进入循环,而是返回到 (fn)。然而,这个 (fn) 回调是必需的,因为 (.getItem) 调用返回一个我无法访问的承诺。
我的问题是,有没有办法让这个 promise 值出来并重新循环到循环中,或者有更好的方法来做到这一点?
【问题讨论】:
-
使用 Promise.all 不是更好更地道(就 cljs 和 js 而言)?类似:
(.then (Promise/all (map #(.then (.getItem localforage %) (fn [v] [% v])) project-map)) (partial into {}))
标签: javascript recursion clojure promise clojurescript