2017-10-02 3 views
2

Ich erwarte, dass der folgende Code syncResult mit "String zwei" ergibt, aber stattdessen erhalte ich den Fehler .Scala-Futures und Await.result()

import scala.concurrent.{Await, Future} 
import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.duration._ 

def randomFunction1(): Future[String] = { 
    Future.successful("string one") 
} 

def randomFunction2(): Future[String] = { 
    Future.successful("string two") 
} 

val asyncResult: Future[String] = for { 
    r1 <- randomFunction1() 
    r2 <- randomFunction2() 
} yield r2 

val syncResult: String = Await.result(
    asyncResult, 
    1.second 
) 

Ich bekomme ähnliche Ergebnisse mit den folgenden.

import scala.concurrent.{Await, Future} 
import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.duration._ 

def randomFunction1(): Future[String] = { 
    Future.successful("string one") 
} 

def randomFunction2(): Future[String] = { 
    Future.successful("string two") 
} 

val asyncResult: Future[String] = randomFunction1().flatMap(
    r1 => { 
     randomFunction2() 
    } 
) 

val syncResult: String = Await.result(
    asyncResult, 
    1.second 
) 

ich die Scala 2.12.2 Interpreter mit diesem :paste mit laufen.

Was ist falsch an meinem Code?

+0

Ihr 'Await()' ist aufgrund der REPL-Umgebung abgelaufen. Es wird ohne Fehler ausgeführt, wenn es aus einer Datei oder aus einem IntelliJ-Arbeitsblatt kompiliert wird. – jwvh

+0

@jwvh für mich funktionieren beide Beispiele wie erwartet in REPL. David könnten Sie die vollständige Ausnahme, d. H. Mit Call-Stack? –

+0

Wenn Sie den 'Await.result' Block durch' asyncResult onComplete ersetzen { Fall Erfolg (a) => Drucken (a) Fall Fehler (err) => drucken ("fehlgeschlagen") } dann sollte es funktionieren. Scheint wie ein Problem mit 'Await.result' – daniely

Antwort

0

Dies schien ein Problem mit der Scala REPL zu sein.

Verwandte Themen