我有这个问题,我想在喷涂路线中称之为未来。我在下面尝试过,我让它工作并在onComplete中返回未来值
def sendFuture(input):Future[String]= Future {
//some string manipulation
result
}
post {
entity(as[String]) {
input =>
{
onComplete(sendFuture(input)) {
case Success(result) => {
complete("received: " + result)
}
case Failure(ex) => complete("An error occurred: " + ex.getMessage())
}
}
}
}
现在,我现在想做一些更复杂的事情。我想调用一个回调,它接受sendFuture中的一个参数,并在sendFuture将它返回给onComplete之前将该字符串返回给sendFuture。如下所示:
def sendFuture(input):Future[String]= Future {
//some string manipulation
callBack.call(
(arg:String)=>
{
//some string manipulation
return callBackResult
}
)
//do something with result based on callBackResult
result
}
post {
entity(as[String]) {
input =>
{
onComplete(sendFuture(input)) {
case Success(result) => {
complete("received: " + result)
}
case Failure(ex) => complete("An error occurred: " + ex.getMessage())
}
}
}
}
如果只有callBack.call()会返回一个字符串,但我是一个void / unit函数。
答案 0 :(得分:0)
您需要将sendFuture
拆分为两个函数,并在第一个函数的结果(这是未来)上使用map
,但我不知道您从哪里获得此callback.call
Future
1}}东西,那不是Scala def computeFirstpart(input: String): Future[String] = {
val promise: Promise[String] = Promise()
// do something with your string
callback.onComplete { case v => promise.complete(v) }
promise.future
}
。无论如何,逻辑很简单:
函数的第一部分应该包含一个promise,它会期望你的回调结果(一切都属于期货的Scala实现),例如:
def sendFuture(input: String): Future[String] = {
computeFirstPart(input) flatMap { resultOfFirstPart =>
// do what you need
result // NOTE 1
}
}
此部分返回回调的结果。现在您可以附加更多计算:
String
注意1 结果应该在 Future 上下文中,您返回简单类型(如map
)使用flatMap
,而不是{{ 1}}。然后在路线结构中使用它:
post {
entity(as[String]) { input =>
onComplete(sendFuture(input)) {
case Success(result) =>
complete("received: " + result)
case Failure(ex) =>
complete("An error occurred: " + ex.getMessage())
}
}
}
}