我正在尝试掌握在 Play 2 中使用 Iteratees 流式传输彗星结果的方法。我已经掌握了从回调创建枚举器和从地图创建枚举器的句柄。我的问题是 Enumeratee.map,这需要一个函数,该函数接受纯输入并返回纯输出(例如doc中的 String 到 Int 的转换)。我想做的是接受一个纯粹的输入并返回一个结果的承诺。毕竟,枚举器向枚举器提供承诺,枚举器将一个枚举器转换为另一个枚举器,因此应该有一种方法可以使枚举器映射到承诺。
现在,让我举一个例子来说明这一点。假设我有一个 http 请求,其中包含要在我的数据库中查询的 ID 列表。假设这些 id 表示数据库表中的行,请求对这些行执行一组(长)计算,然后返回一组表示计算的 json 对象。由于我有很长的事情要做,所以一次流式传输一个 ID 会很酷,所以我希望有一个枚举管道:
- 查询数据库中的一行(返回该行的承诺)
- 对行进行长时间计算(取一行并返回计算的承诺)
- 将长计算转换为 JSON
- &> 将此输出到 Play 2 提供的 Comet 枚举对象
1 有点简单,我可以构造一个带有 fromCallback 的枚举器,它将返回查询结果的承诺。3 也有点简单,因为它是一个简单的 Enumeratee.map
但是我无法理解如何实现步骤 2 的枚举对象的 applyOn。我可以理解我已经构建了一个新的迭代对象,它从“内部”迭代对象获得承诺,flatMap 长计算并返回新的承诺。我没有得到的是如何在给定奇怪的 applyOn 签名的情况下做到这一点:def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]
有人可以帮我吗?
谢谢