3

Ich bin neu in Scala von Java, so dass die funktionale Programmierung Sache ist immer noch ein bisschen schwierig für mich zu verstehen. Ich habe ein Projekt im Play-Framework. Ich muss die Datenbank abfragen, um Reihen mit Ids zu erhalten und sie in einer HTML-Schablone anzuzeigen.Get Future Objekte aus Zukunft Optionen in Scala

Hier ist mein Code

def search(query: String) = Action.async{ request => 
    val result = SearchEngine.searchResult(query) 
    val docs = result.map(DocumentService.getDocumentByID(_).map(doc => doc)) 
    val futures = Future.sequence(docs) 
    futures.map{documents => 
     Ok(views.html.results(documents.flatten)) 
    } 
    } 

getDocumentByID kehrt ein Future[Options[Document]] Objekt, aber meine results Vorlage nimmt Array[Document] so habe ich ohne Erfolg versucht, die Future[Options[Document]] zu Array[Document]

Der aktuelle Code I haben zu verwandeln das Nächste, das ich gewesen bin, aber es kompiliert immer noch nicht. Dies ist der Fehler:

Error:(36, -1) Play 2 Compiler: 
    found : Array[scala.concurrent.Future[Option[models.Document]]] 
    required: M[scala.concurrent.Future[A]] 

Antwort

3

Versuchen Sie collect nur die Some s aus der Zukunft durch den getDocumentByID zurück

val docs = result.map { res => 
    val f: Future[Option[Document]] = DocumentService.getDocumentByID(res) 
    f.collect { case Some(doc) => doc } 
}.toList 

val futures = Future.seqence(docs) //notice that docs is converted to list from array in the previous line 

Allgemeinen Vorschlag

nicht Array s Verwenden Sie. Arrays sind veränderbar und sie wachsen nicht dynamisch. Es ist daher ratsam, die Verwendung von Array im parallelen/parallelen Code zu vermeiden.

+1

Ich habe gerade das getan, aber es gibt einen Fehler in 'Ok (views.html.results (documents.flatten))' Zeile. Es heißt: 'type mismatch, erwartet: Array [Dokument], tatsächlich: Array [Nichts]' – Ken

+0

@Ken remove 'flatten' – pamu

+0

Wenn ich es entferne gibt es immer noch Fehler:' Typ nicht übereinstimmen, erwartet: Array [Dokument], tatsächlich : mutable.ArrayOps [Dokument] ' – Ken