2017-07-27 4 views
3

Ich habe zwei Methoden und beide gibt für Future zurück [Entweder [String, T]] und möchte sie zusammen ketten, um den Job zu erledigen. Ich benutze Scala 2.12. Entweder ist jetzt richtig voreingenommen.Scala 2.12 Kombination von Future und Entweder (voreingenommene Version)

Zum Beispiel

Wenn die Funktion nicht Zukunft und entweder Kombination zurückkehrt, kann ich einfach mit für das Verständnis wie folgt.

aber jetzt möchte ich den Fehler mit entweder mit der folgenden Syntax erfassen und zum Endergebnis weitergeben. Was ist der beste Weg, um das zu erreichen? Sollte auch callB oder callB1 verwendet werden?

Ich weiß mit Katzen Transform Monade könnte dies vereinfachen. Willkommen, um mir eine Lösung für die Verwendung von Standard-Lib und Katzen zu geben.

+1

wenn Sie einfach verwenden 'Either' '' Left'' um eine 'String' zurück zu geben, von der ich annehme, dass es sich um eine Textnachricht handelt, die den Fehler enthält, warum nicht einfach' Success' und 'Failure' in' Future' einbauen? – Yaneeve

+2

Schätze, du könntest einen Blick auf 'EatT' von' cats' oder 'scalaz' werfen wollen – jilen

+0

@Yaneeve Ich möchte es einfach machen, es ist ein individuelles Fehlerobjekt. – ttt

Antwort

5

Wie die Kommentare erwähnt haben, können Katzen und Scalaz damit umgehen. Aber ich kann auch den Wunsch verstehen, keine weitere Abhängigkeit oder Komplikation für ein ziemlich kleines Stück Logik einzuführen. Hier ist, was Sie tun können, wenn Sie es selbst implementieren möchten:

implicit class FutureEither[A](val wrapped: Future[Either[String, A]])(implicit ec: ExecutionContext) { 
    def map[B](f: A => B): FutureEither[B] = wrapped.map(_.map(f)) 

    def flatMap[B](f: A => FutureEither[B]): FutureEither[B] = wrapped.flatMap { 
    case Left(s) => Future(Left(s)) 
    case Right(a) => f(a).wrapped 
    } 
} 

Implementierung map und flatMap mit entsprechenden Typen ermöglicht die exakt gleichen Stil für Verständnis:

def convert(a: A, b: B): C = ??? 
def callA(): FutureEither[A] = ??? 
def callB(a: A): FutureEither[B] = ??? 

def chain: FutureEither[C] = for { 
    a <- callA() 
    b <- callB(a) 
} yield convert(a, b) 
+0

Frage ist, wie können wir 'FutureEither [C]' zurück in eine 'Zukunft [Entweder [String, C]]' '? Vielen Dank. – ttt

+0

Tun Sie einfach ".wrapped" –

Verwandte Themen