如何返回concurrent.Future在下面的代码中:
val nextMeetup = ws.url(url).stream()
.flatMap( response => response.body
.via(framing)
.map(_.utf8String)
.map(_ + "\n")
)
类型不匹配错误: 发现:akka.stream.scaladsl.Source [String,_ $ 2] 必需:scala.concurrent.Future [?]
我的网址拆分了json数据流 - 它不是推特流
请解释一下解决这个问题。
答案 0 :(得分:0)
您想从响应中得到什么并不是很清楚。 stream()
会返回Future
,因此如果您flatMap
,则还需要从处理程序返回未来。你到底想要什么回来?例如,如果您希望获得整个响应的Future[String]
,则可以使用runReduce(_ + _)
:
val result: Future[String] = ws.url(url).stream()
.flatMap(response => response.body
.via(framing)
.map(_.utf8String)
.map(_ + "\n")
.runReduce(_ + _)
)
runReduce(f: (U, U) => U)
会返回Future[U]
,也就是说,在您的情况下会是Future[String]
。如果您想通过其他功能单独处理传入流的每个元素,可以使用runForeach
:
ws.url(url).stream()
.flatMap( response => response.body
.via(framing)
.map(_.utf8String)
.map(_ + "\n")
.runForeach(s => handleString(s))
)
如果没有更多关于你想做什么的细节,很难提供更具体的答案。
更新:如果您想限制来自外部服务器的邮件,可以使用内置的throttle
组合器:
val result: Future[Source[String, _]] = ws.url(url)
.stream()
.map { response =>
response.body
.via(framing)
.map(_.utf8String)
.map(_ + "\n")
.throttle(10, 1.second, 10, ThrottleMode.Shaping)
}
此处,result
未来将包含String
s流,在实现时,每秒最多可产生10个元素,必要时可进行背压。您可以在我上面链接的文档中找到更多信息。