2016-04-07 35 views
0

Merhaba,tür uyumsuzluğu scala.concurrent.Future 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" 
      ))) 
    }) 

Çal Ve Model i vardır: Yani (Eylem) Sonuç bekliyor Çal

// 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) 
} 

ve sütununda, bu hata:

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

ve bu:

enter image description here

Neden bu hatanın nedenini açıklayabilir ve çözmek için bazı ipuçları verebilir misiniz?

Eğer

+0

, metnin görüntülerini yayınlayacağız yerine metin kullanmayın ... –

+0

Denedim

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" )))) }) 
gibi bir şey denemelisiniz '(' kodunda kalın, ancak Stackoverflow'ta kabul edilmez! – elarib

cevap

0

sizin Message.getMessages sırayla Failure durumunda Success durumunda bir Future[Result] ve Result dönmek için bütün match blok girişimde bir Future[Something] döndürdüğünü görünüyor ederiz.

(siz Future[Result] ile bitirmek emin olur flatMap fark edip Future[Future[Result]] bir değil) Aşağıdaki