2014-06-30 80 views
1

我有這個問題,我想打電話給未來的噴霧路由。下面我已經試過,我有工作在的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

您需要sendFuture分成兩個功能和結果使用map(這是一個未來的)第一功能的,但我不知道你在哪裏得到這個callback.call東西,這不是斯卡拉Future。但無論如何,邏輯很簡單:

功能的第一部分應包含一個承諾,這將期待您的回調的結果(一切都屬於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 
} 

這部分返回你的回調結果。現在,您可以將更多的計算:

def sendFuture(input: String): Future[String] = { 
    computeFirstPart(input) flatMap { resultOfFirstPart => 
    // do what you need 
    result // NOTE 1 
    } 
} 

注1:結果應該是在未來情況下,你是返回簡單類型(如String)使用map,不flatMap。然後用它在你的航線結構:

post { 
    entity(as[String]) { input => 
     onComplete(sendFuture(input)) { 
      case Success(result) => 
      complete("received: " + result) 
      case Failure(ex) => 
      complete("An error occurred: " + ex.getMessage()) 
     } 
     } 
    } 
} 
+0

我不明白這部分的工作原理: 'callback.onComplete {情況下V => promise.complete(V)}' 在我的原代碼中的回調一個java類,它沒有「onComplete」方法。它唯一的方法是call(),它接受一個接受字符串但不返回任何內容的函數 – user3747998