我正在尝试在 Play 2 中使用 Iteratees 来流式传输 cometd 结果。我已经得到了从回调创建枚举器和从 map 创建枚举器的句柄。 我的问题是 Enumeratee.map,它采用一个接受纯输入并返回纯输出的函数(例如 doc 中的 String 到 Int 转换)。我想做的是接受纯粹的输入并返回结果的 promise 。 毕竟,枚举器向枚举器提供 Promise,枚举器将一个枚举器转换为另一个枚举器,因此应该有一种方法来创建映射到 Promise 的枚举器。
现在,让我举一个例子来使这一点更清楚一些。假设我有一个 http 请求,其中包含要在数据库中查询的 ID 列表。假设这些 id 表示数据库表中的行,并且请求对这些行执行一组(长)计算,然后返回一组表示计算的 json 对象。 由于我有很长的阻塞任务要做,所以一次流式传输一个 ID 会很酷,所以我希望有一个枚举管道可以:
- 查询数据库中的一行(返回该行的 promise )
- 对行进行长时间计算(获取一行并返回计算的 promise )
- 将长计算转换为 JSON
- &> 将其发送给 Play 2 提供的 Comet 枚举
1 有点简单,我可以用 fromCallback 构造一个枚举器,它将返回查询结果的 promise 。 3 也有点简单,因为它是一个简单的 Enumeratee.map
但是我无法理解如何实现步骤 2 的枚举数的 applyOn 。我可以理解,我已经构建了一个新的迭代器,它从“内部”迭代器获得了 promise , flatMap 长计算并返回新的 promise 。我不明白的是如何在给定奇怪的 applyOn 签名的情况下实现此目的: def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]
有人可以帮我吗?
谢谢
最佳答案
master Enumeratee.mapM[E] 上有一个方法,它接受 f: E => Promise[NE] 并返回 Enumeratee[E, NE]
关于scala - play2 制作一个 Enumeratee 将一个 Promise 转换为另一个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688581/