Scala期货和方法使用喷涂路由回调

时间:2014-06-30 03:17:12

标签: scala callback future spray

我有这个问题,我想在喷涂路线中称之为未来。我在下面尝试过,我让它工作并在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函数。

1 个答案:

答案 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())
        }
      }
   }
}