我正试着在Play 2.2.x中找到Iteratee库.我正在编写一个生成数据流的函数,计算成本很高.这是基本的想法,用方块替换昂贵的计算部分:
def expensiveFunction(x: Int): Future[Int] = Future.successful(x * x) def expensiveRange(start: Int, end: Int): Enumerator[Future[Int]] = { Enumerator.enumerate(start to end).map(i => expensiveFunction(i)) }
如果我打电话给expensiveRange
我得到一个Enumerator[Future[Int]]
,这不是我想要的,因为它似乎没有利用Iteratee模式的显式异步.看来我应该能够把它变成一个Enumerator[Int]
封底使用我返回的期货而不是创造另一层的Future
.
我认为将结果转化Enumerator[Int]
为可取的是正确的吗?如果是这样,这样做的惯用方法是什么?
你可以转换Enumerator[Future[Int]]
成Enumerator[Int]
这种方式:
val enumF = Enumerator((1 to 10).map{Future(_)}:_*) // Enumerator[Future[Int]] val enum = enumF &> Enumeratee.mapM(identity) // Enumerator[Int]
但是你不需要这种转换,因为正如Travis Brown 所说,你可以像这样重写你的方法:
def expensiveRange(start: Int, end: Int): Enumerator[Int] = { Enumerator.enumerate(start to end) &> Enumeratee.mapM(expensiveFunction) }