2015-10-28 6 views
0

Я использую Scala/Slick 3.1 (все это через активатор разбрызгивания распылителя) и имеет 4 разных запроса, которые я хочу вернуть как один объект. Я пытаюсь собрать все будущее вместе в одно будущее.Scala для понимания и опций

Это работает, но проблема в том, что если запрос терпит неудачу (I.e., мы ищем что-то, что не существует), существует исключение во время выполнения.

То, что я думаю, что на самом деле это не в состоянии все это, если один запрос не удается, и в конечном итоге вернуть будущее [Option]

Все это подключается через спрей

поэтому код запроса выглядит следующим образом:

// .. snip .. FindById() 
     val a = db.run(q1.result) // Future[Seq[Tuple]]] 
     val b = db.run(q2.result) 
     val c = db.run(q3.result) 
     val d = db.run(q4.result) 

     // compose the futures together into one future 
     val res = for { 
    resA <- a 
    resB <- b 
    resC <- c 
    resD <- d 
    } yield { 
     PhoneMerged(resA.head._1, resA.head._2, resB.map(x => FeaturesSimple(x.featurename)).toList, resD.map(x => FeaturesvaluepairSimple(x.featuretype, x.featurevalue)).toList, 
      resC.map(x => IncludedaccessorySimple(x.accessoryvalue)).toList, createPhoneImage(resA.head._1.devicemcd)) 
    } 

Она вызывается с

onComplete((modules.phonesDAA ? FindById(id)).mapTo[Future[PhoneMerged]]) { 
      case Success(phoneOption) => { 
      println(phoneOption) 
      complete(phoneOption) 
      } 
      case Failure(ex) => { 
      println("uh oh") 
      complete("{}") 
      } 
     } 

в конечном счете, я хочу вернуть либо сериализованный JSON объект PhoneMerged (который работает, если я ищу действительный идентификатор), либо «{}» пустой json ...

У кого-нибудь есть мысли о том, как правильно обрабатывать результат/обрабатывать ошибка ?

ответ

1

Вы можете сделать функцию FindById возвратом Future[Option[PhoneMerged]] и обработать случай отказа внутри с помощью комбинатора будущего, такого как recover.
Например:

val a = db.run(q1.result) 
    // Future[Seq[Tuple]]] 
    val b = db.run(q2.result) 
    val c = db.run(q3.result) 
    val d = db.run(q4.result) 

    // compose the futures together into one future 
    val res = for { 
    resA <- a 
    resB <- b 
    resC <- c 
    resD <- d 
    } yield { 
     Some(PhoneMerged(resA.head._1, resA.head._2, resB.map(x => FeaturesSimple(x.featurename)).toList, resD.map(x => FeaturesvaluepairSimple(x.featuretype, x.featurevalue)).toList, 
     resC.map(x => IncludedaccessorySimple(x.accessoryvalue)).toList, createPhoneImage(resA.head._1.devicemcd))) 
    } recover {case e: YourExceptionType => None} 
Смежные вопросы