clojure 中 Web 响应的异步合并

标签 asynchronous clojure

我正在尝试编写一段代码:

  • 通过一些请求访问 2 个网络服务
  • 响应将是对象序列,每个对象由 id 标识,响应按 ID 升序排序
  • 响应将很大并且流式传输(或 gzip 分块)
  • 结果将是根据 ID 合并来自两个输入的数据

我试图实现的是,一旦响应的相应部分可用,就应该写出输出。我也不想等待整个响应到位,因为这会耗尽内存。我想尽快开始流式输出并尽可能少地保留在内存中。

什么是开始的好方法?

我看过 aleph 和 lamina,还有 async.http.client。这些工具似乎可以帮助我,但我很难弄清楚如何让一段代码对来自两个 Web 服务的响应的相同部分使用react。

最佳答案

你可以做这样的事情(使用 aleph - 在引擎盖下使用层 channel 抽象)。

现在,订阅回调将在到达任一 channel 时立即接收每个 JSON 对象,然后您可以拥有一个本地 atom,它是一个映射,键是您在其上的值想要将来自 2 个 channel 的结果和值组合为一个向量,它将存储相同键的值。所以这将是这样的:

  • 在回调中收到一个项目时,检查本地 atom 映射是否已经有键
  • 如果 key 已经存在,则存储 key 的 2 个项目(一个已经在 map 中,另一个是您刚刚收到的项目)或对其进行一些其他处理,然后从 map 中删除 key 。
  • 如果键不存在,则将键和值创建为 [item],即现在正在接收的一项的向量。

关于clojure 中 Web 响应的异步合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067217/

相关文章:

javascript - 在我的 polyfill 和其他脚本上设置 defer 会保证它们按顺序加载吗?

iphone - 在 iOs 中具有多个异步 NSURLConnection 的 UIProgressView

clojure - 解析宏中的符号

clojure - leiningen - 相当于 lein run 的 clojurescript?

c# - 与异步方法相关的 VoidTaskResult 类型是什么?

javascript - 在 AngularJS 中异步调用 hprose.httpclient

javascript - 等待多个异步函数,但在一个完成后继续

clojure - 命名空间关键字使 JSON 规范无效

performance - 从并发编程(语言)中受益?

clojure - 如何实际使用 ClojureScript?