2016-02-25 102 views
1

進出口使用播放和擁有,我想要做的兩件事情的操作: -嵌套期貨在玩動作

  1. 首先檢查我的緩存值
  2. 其次,調用與價值的網絡服務

由於WS API返回Future,我使用的是Action.async
我的Redis緩存模塊還返回Future

假設我對可能長時間運行的任務適當地使用了另一個ExecutionContext。

問:有人可以通過以下步驟確認我是否在正確的軌道上。我知道我沒有滿足以下例外情況 - 只是爲了簡潔而保持簡單。

def token = Action.async { implicit request => 


    // 1. Get Future for read on cache 

    val cacheFuture = scala.concurrent.Future { 
     cache.get[String](id)  
    } 


    // 2. Map inside cache Future to call web service 

    cacheFuture.map { result => 

     WS.url(url).withQueryString("id" -> result).get().map { response => 
      // process response 
      Ok(responseData) 
     } 

    } 

} 

我擔心的是,這可能不是做事情的最有效的方式,因爲我認爲不同的線程可以處理完成每一個期貨的任務。

任何建議更好的方法,不勝感激。

回答

3

這不是特定於Play的。我建議你看一下文檔解釋Future的工作原理。

val x: Future[FutureOp2ResType] = futureOp1(???).flatMap { res1 => futureOp2(res1, ???) } 

或者與-理解

val x: Future[TypeOfRes] = for { 
    res1 <- futureOp1(???) 
    res2 <- futureOp2(res1, ???) 
    // ... 
} yield res 

對於Future s的執行方式(使用線程),這取決於其ExecutionContext使用(例如全球性的遊戲之一。 ..)。

WS.get返回Future,它不應該被內cacheFuture.map叫,否則會返回一個Future[Future[...]]

+0

好cchantep感謝您的意見。如果能夠幫助解決我的問題,我會在文檔中進一步挖掘並回來。 – JamieP