2017-10-04 1 views
1

Ich habe ein Problem mit dem folgenden Code-Schnipselscala Playframework Entfernen Zukunft und weisen Sie

val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
prerequisiteFuture.map(prereqTemplates => { 
    processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => { 
    step.stepPrerequisites = Some(pres) 
    step.prerequisites = processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(preReqs => { 
     preReqs 
    }) 
    step 
    }) 
}) 

Problem ist folgendes: enter image description here

found : scala.concurrent.Future[Seq[models.ProcessStepPrerequisitesModel]]* [error] required: Option[Seq[models.ProcessStepPrerequisitesModel]]

Wie kann ich die Zukunft entfernen ? Danke

+0

Was ist die Art der processTemplateDTO.getProcessTemplates (..)? – Nyavro

+0

der Typ ist 'Future [Seq [ProcessStepPrerquisitesModel]]' – Felix

Antwort

0

ich jetzt eine funktionierende Lösung haben:

val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
      prerequisiteFuture.map(prereqTemplates => { 
       processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => { 
       step.stepPrerequisites = Some(pres) 

       processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(b => 
        step.prerequisites = Some(b)) 

       step 
       }) 
      }) 
5

Es gibt keine Möglichkeit, Future loszuwerden, es sei denn, Sie warten auf die Zukunft, um schließlich die Verarbeitungspipeline abzuschließen.

Transformieren Sie die Zukunft mit map und flatMap oder zum Verständnis.

Angenommen, Sie haben def foo: Future[A] und Sie wollen B

die

Zukunft Trans
foo.map(toB) 

Jetzt werden Sie Future[B] bekommen. Aber es gibt keine Möglichkeit, B Wert zu erhalten, ohne die Ausführung in Zukunft abzuschließen.

Ohne zu warten, ist der einzige Weg, Future loszuwerden, zu warten, bis es abgeschlossen ist, aber Rückgabetyp wird Unit sein.

futureComputation.onComplete { 
    case Success(_) => 
    case Failure(_) => 
} 

Nicht gut Praxis

import scala.concurrrent.duration._ 

Try(Await.result(prerequisiteFuture, 10.seconds)).toOption 

Weitere Informationen: How risky is it to call Await.result on db calls

+0

erwarten ist nicht das, was ich erwarte zu verwenden ... – Felix

+0

Problem ist nicht die Asynchronität von scala ... Problem ist der falsche Typ – Felix

+0

auch onComplete ist nicht die Antwort meiner Frage – Felix

2

Sie können nicht nur Zukunft entfernen, weil Zukunft den Wert abstrahiert, die wahrscheinlich noch nicht berechnet. Wie ich aus deinem Code ersehen kannst, versuchst du, veränderbare Schrittfelder zu initialisieren, indem du Futures mappst. Das ist definitiv falsch.

Versuchen für das Verständnis für diesen Einsatz:

val combinedFuture = for { 
    v1 <- methodReturningFuture1 
    v2 <- methodReturningFuture2 
    v3 <- methodReturningFuture3 
} yield (v1,v2,v3) 
+0

kann ich "für Ertrag" in einem anderen "für Ertrag" nisten? – Felix

Verwandte Themen