2016-04-07 3 views
0

Hallo,Typenkonflikt scala.concurrent.Future mit Slick & Play-Framework

def getMessages(code:String,offset:Option[Int]) = Action.async(parse.json){request => 

    val forPC = (request.body \ "forPC").asOpt[Boolean] 

    Talk.findByCode(code).map(_ match{ 
     case Success(talk) => 
      val talkId = talk.id 
      Message.getMessages(talkId=talkId,offset=offset.getOrElse(0), forPC).map(_ match { 
       case Seq(Tables.Messages) => Ok("Cool") 
       case _ => Ok("No") 
      }) 
     case Failure(e) => 
      Logger.error(e.getMessage) 
      NotAcceptable(Json.toJson(Map(
       "error" -> "failed" 
      ))) 
    }) 

Und im Modell ich habe:

// talks by Code 
    def findByCode(code: String, conferenceid : Int) = { 
    val query = talks.filter(talk => talk.conferenceId === conferenceid && talk.code === code) 
    db.run(query.result.head.asTry) 
    } 


    def getMessages(talkId:Int ,offset:Int, forPC: Option[Boolean]) = { 
    val forPCVal = forPC.getOrElse(false) 
    //ordering by talkId because it's faster than timestamp 
    val query = messages.filter(msg => msg.talkId === talkId && msg.forpc === forPCVal).sortBy(_.idmessage.desc).drop(offset).take(10).result 
    db.run(query) 
} 

So spielen für Ergebnis warten (Action), und es zeigt diesen Fehler:

type mismatch; 
found : scala.concurrent.Future[play.api.mvc.Result] 
required: play.api.mvc.Result 

und diese:

enter image description here

Kann jemand erklären, warum dieser Fehler und gibt mir einige Hinweise, um es zu lösen?

Danke

+0

nicht Screenshots von Text veröffentlichen, Text stattdessen ... –

+0

Ich habe versucht, um das "fett" im Code zu machen, aber es ist nicht akzeptabel in Stackoverflow! – elarib

Antwort

0

Es scheint, dass Ihre Message.getMessages ein Future[Something] zurück, was wiederum Ihren ganzen match Block Versuch machen, ein Future[Result] im Success Fall und ein Result im Failure Fall zurückzukehren.

Sie sollten so etwas wie das folgende versuchen (die flatMap feststellen, dass sicher macht Sie mit Future[Result] am Ende und nicht ein Future[Future[Result]])

Talk.findByCode(code).flatMap(_ match{ 
    case Success(talk) => 
     val talkId = talk.id 
     Message.getMessages(talkId=talkId,offset=offset.getOrElse(0), forPC).map(_ match { 
      case Seq(Tables.Messages) => Ok("Cool") 
      case _ => Ok("No") 
     }) 
    case Failure(e) => 
     Logger.error(e.getMessage) 
     Future.successful(NotAcceptable(Json.toJson(Map(
      "error" -> "failed" 
     )))) 
})