2017-09-19 82 views
0

我有一個項目階與http4s 0.15.16a和光滑3.2.1下列步驟操作:Await.result上HttpService的

  1. 通過REST調用接收一個ID
  2. 通過ID來MySlickDAO與響應一個未來
  3. 呼叫Await.result(RES,Duration.Inf)在未來返回由MySlickDAO
  4. 創建JSON

的問題是,我使用的是Await.re這是不好的做法 有沒有更好的解決方案?

下面的代碼:

val service = HttpService { 

//http://localhost:8080/rest/id/9008E75A-F112-396B-E050-A8C08D26075F 
case GET -> Root/"rest"/"id"/id => 

    val res = MySlickDAO.load(id) 

    Await.result(res, Duration.Inf) 

    val ll = res.value.get.get 
    ll match { 
    case Failure(x) => 
     InternalServerError(x) 
    case Success(record) => 
     val r = record.map(x => MyEntity(x._1, x._2, x._3)) 
     jsonOK(r.asJson) 
    } 
case .... 

}

+0

爲什麼要做'未來'封鎖? – cchantep

+0

@cchantep我等待未來完成 – gekomad

+0

爲什麼?這不是通常使用'Future'(這是如此失去所有興趣)的方式 – cchantep

回答

1

而是等待,你可以鏈中的一個Future的結果到另一個:

val resFut = MySlickDAO.load(id) 
resFut.map { record => 
    val r = record.map(x => MyEntity(x._1, x._2, x._3)) 
    jsonOK(r.asJson) 
} recover { x => 
    InternalServerError(x) 
} 

這樣做的結果將是一個Future的一個常見的超類型jsonOKInternalServerError(不熟悉您使用的庫;所以我可能有類型o f加載錯誤:這不是Future[Try[_]]是嗎?)。

BTW:你原來的代碼有一個很大的問題行:

val ll = res.value.get.get 

res.valueOption[Try[T]]。在OptionTry上調用getTry通常是一個壞主意(即使在這種情況下,由於AwaitOption不應該是None,所以get在技術上是安全的),因爲它可能會引發異常。你使用mapflatMap和朋友好多了。

+0

map返回Future而不是Task [Response]等問題依然存在 found:scala.concurrent.Future [scalaz.concurrent.Task [org.http4s。響應]] 必需:scalaz.concurrent.Task [org.http4s.Response] resFut.map {record => – gekomad

0

問題是,http4s 0.15使用Scalaz併發結構,而Slick使用本地Scala,而兩者不能相互配合使用。我的理解是,http4s 0.17+已經從Scalaz轉換爲Cats,這可能需要使用本地的Scala Futures,所以如果你可以升級那可能值得一試。

def scalaFutureRes = MySlickDAO.load(id) 
val scalazTaskRes = Task.async { register => 
    scalaFutureRes.onComplete { 
    case Success(success) => register(success.right) 
    case Failure(ex)  => register(ex.left) 
    } 
} 

此時,您已經有了一個任務[與resultType]從未來[與resultType]這樣你可以映射/ flatMap用:如果沒有,您可以通過手動創建一個包裝你的未來任務處理轉換你的其他邏輯就像列維的答案一樣。

你也可以使用delorean這個庫,它具有這個邏輯,並且通過隱式轉換在相關的類上定義了相反的方向,這樣你就可以在Future上調用.toTask來獲得它的兼容形式。他們的自述文件還提供了很多關於轉換的有用信息以及存在哪些缺陷。