我有一系列的承诺。我想等到他们全部可用,然后deref得到整个向量。
我的实际用例是using HTTPKit来制作一些并发请求,然后在返回所有请求时处理它们。
收集的顺序很重要,但可以在活动结束后进行伪造和重新订购。
我目前正在做这样的事情:
qs
所有查询都是在map
绑定中发布的,然后地图会依次阻止每个查询,直到它在[a+b for a in range(n) for b in range(n)]
中删除。
这会达到我想要的结果吗?
答案 0 :(得分:4)
这个实现最初可能会起作用,特别是如果您通过传递查询网址向量来单独测试函数,因为Clojure使用chunked sequences以及它们如何&# #39;由map
函数处理。但是,你不应该依赖于这种行为,因为如果调用代码开始传入一些非分块序列(例如列表,或者由谁知道什么计算的另一个懒惰序列),你就会失去并行性。输入)。
请注意,map
是惰性的,因此将qs
绑定为(map http/get queries)
会产生一个 lazy 序列,在此之前不会提交请求&# 39;被迫这样做。 (map #(json/read-str (:body @%)) qs)
返回另一个将处理(懒惰)qs
序列的惰性序列,提交API调用,然后在函数调用者请求时一次阻塞一个事实,使错误更加复杂。返回序列中的项目。在最糟糕的情况下,您的API请求将按顺序提交。
为了确保您的所有请求都是并行提交的,并且已收到所有回复,请将您map
(请求和deref)的来电包裹在doall
内,这将是强迫评估懒惰序列。