Play Framework的迭代器库定义了一个名为
请参考:http://www.playframework.com/documentation/2.2.x/Enumerators
你可以在这里看到一个很好的例子,展示了如何使用它从 Web 服务中获取分页结果: http://engineering.klout.com/2013/01/iteratees-in-big-data-at-klout/
有没有相应的scalaz-stream代码可以完成同样的任务?我相信可以使用
如果简化一些,我们可以忽略Scala Future与Scalaz Task的区别,并假设我们有一个Task。
Enumerator.fromCallback
的方法,该方法允许基于Future的结果生成元素。请参考:http://www.playframework.com/documentation/2.2.x/Enumerators
def fromCallback[E](
retriever: () => Future[Option[E]],
onComplete: () => Unit = () => (),
onError: (String, Input[E]) => Unit = (_: String, _: Input[E]) => ()
): Enumerator[E]
你可以在这里看到一个很好的例子,展示了如何使用它从 Web 服务中获取分页结果: http://engineering.klout.com/2013/01/iteratees-in-big-data-at-klout/
def pagingEnumerator(url:String):Enumerator[JsValue]={
var maybeNextUrl = Some(url) //Next url to fetch
Enumerator.fromCallback[JsValue] ( retriever = {
val maybeResponsePromise =
maybeNextUrl map { nextUrl=>
WS.url(nextUrl).get.map { reponse =>
val json = response.json
maybeNextUrl = (json \ "next_url").asOpt[String]
val code = response.status //Potential error handling here
json
}
}
/* maybeResponsePromise will be an Option[Promise[JsValue]].
* Need to 'flip' it, to make it a Promise[Option[JsValue]] to
* conform to the fromCallback constraints */
maybeResponsePromise match {
case Some(responsePromise) => responsePromise map Some.apply
case None => PlayPromise pure None
}
})
}
有没有相应的scalaz-stream代码可以完成同样的任务?我相信可以使用
Process.emit
、Process.await
或者Process.eval
来实现,但我想看一个具体的例子。这可能需要将Scala Future转换为Scalaz Task,这里有一个答案:将Scala 2.10 Future转换为Scalaz.concurrent.Future // Task。如果简化一些,我们可以忽略Scala Future与Scalaz Task的区别,并假设我们有一个Task。