0

我有我的控制器的一個非常複雜的流程,這是怎麼一回事呢用詞:讓控制器返回類型錯誤試圖返回未來,當[結果]

- get the request 

- translate it to my model 
    case it succeed: 
     insert some record to my db 
     case it succeed: 
      perform some api call 
       case it succeed: 
        match its returned value 
       case failed: 
     recover with proper result 
     case failed: 
      recover with proper result 
    case failed: 
    recover with proper result 

,但在我的代碼我得到一些冥冥中我不是返回結果的正確前景錯誤...

錯誤:

expression of type unit doesnt conform to expected type Future[Result]

這是代碼:

def myApiMethod ... 

    val requestAsModel = request.body.extractOpt[MyModel] 

    requestAsModel match { 
     case Some(req) => 
     // returning Future 
     dbService.insert.onComplete { 
      case Success(x) => 
      myApiService.doSomething(req).map { 
       case good: GoodRes => Ok(Extraction.decompose(good)) 
       case bad: BadRes => BadRequest(Extraction.decompose(bad)) 
      } recover { 
       case ex => 
       InternalServerError 
      } 
      case Failure(ex) => Future {InternalServerError} 
     } 
     case None => 
     Future.successful(BadRequest("not a good body content")) 
    } 
} 

所以你看到這裏的問題?

它看起來像是一個很好的做法,控制器是這樣寫的?

感謝

回答

0

未來的onComplete方法返回單位documentation。 您需要更換的onCompleteflatMap通話,才能產生未來轉變成未來[結果]:

dbService.insert.flatMap{ 
     case Success(x) => 
       myApiService.doSomething(req).map { 
        case good: GoodRes => Ok(Extraction.decompose(good)) 
        case bad: BadRes => BadRequest(Extraction.decompose(bad)) 
      } recover { 
       case ex => 
       InternalServerError 
      } 
     case Failure(ex) => Future {InternalServerError} 
    } 

我建議閱讀這篇文章Scala Futures guide。特別是關於撰寫期貨的一部分。