scala - play2 制作一个 Enumeratee 将一个 Promise 转换为另一个 Promise

标签 scala playframework playframework-2.0 loops

我正在尝试在 Play 2 中使用 Iteratees 来流式传输 cometd 结果。我已经得到了从回调创建枚举器和从 map 创建枚举器的句柄。 我的问题是 Enumeratee.map,它采用一个接受纯输入并返回纯输出的函数(例如 doc 中的 String 到 Int 转换)。我想做的是接受纯粹的输入并返回结果的 promise 。 毕竟,枚举器向枚举器提供 Promise,枚举器将一个枚举器转换为另一个枚举器,因此应该有一种方法来创建映射到 Promise 的枚举器。

现在,让我举一个例子来使这一点更清楚一些。假设我有一个 http 请求,其中包含要在数据库中查询的 ID 列表。假设这些 id 表示数据库表中的行,并且请求对这些行执行一组(长)计算,然后返回一组表示计算的 json 对象。 由于我有很长的阻塞任务要做,所以一次流式传输一个 ID 会很酷,所以我希望有一个枚举管道可以:

  1. 查询数据库中的一行(返回该行的 promise )
  2. 对行进行长时间计算(获取一行并返回计算的 promise )
  3. 将长计算转换为 JSON
  4. &> 将其发送给 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]

https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/iteratee/Enumeratee.scala#L150

关于scala - play2 制作一个 Enumeratee 将一个 Promise 转换为另一个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688581/

相关文章:

scala - 为什么调用错误或在 BodyParser 的 Iteratee 中完成请求在 Play Framework 2.0 中挂起?

java - play.data.Form - 如何最好地填写默认表单值

java - Play Framework 2 渲染错误,util 列表

twitter-bootstrap - Twitter Bootstrap v2.1.0 Play Framework 2 - 图像和 JavaScript 插件无法正常工作

json - 将 Akka actorRef 发送到 json

scala - 使用隐式推断未知类型

scala - 在 Scala 中解析文件的惯用方法

java - 在 Android 设备上运行 scala 代码

model-view-controller - 授权应该是模型或 Controller 的一部分吗?

java - Play 框架中的模型子包