2016-04-11 4 views
1

Итак, я совершенно не знаком с Scala, исходя из фона Java и получил огромную базу кода scala для изучения. И я очень потерян и буду признателен за любую помощь.scala return the Future [Option [user]]

У меня есть функция ниже, которую я хочу переустановить. В настоящее время функция вызывает две функции в строке, а затем возвращает результат. Первая функция возвращает логическое значение, а вторая функция возвращает пользователя. Однако, что на самом деле должно произойти, так это то, что вторая функция должна вызываться только в том случае, если первая функция возвращает true. Поэтому мне нужно переставить его, чтобы проверить возвращаемое значение первой функции перед продолжением. Каждый раз, когда я переписываю его для этого, я либо получаю ошибку компиляции, либо исключение. Предполагается вернуть Future [Option [User]], и первая функция не возвращает пользователя. Я просто хочу вернуть None, если FunctionA терпит неудачу, но поскольку он ожидает Future [Option [X]]], он недоволен. Итак, ниже приведена функция:

private def profileForCredentials(userId: String, password: String)(implicit ec: ExecutionContext): Future[Option[User]] = 
    { 
     val credentials: Throwable \/ Boolean = { 
     try { 
     FunctionA(userId, password).right[Throwable] 
     } 
     catch { 
     case npe: NullPointerException => 
      npe.left[Boolean] 
     } 
    } 

    //This function doesn't need to be called unless credentials=true 
    FunctionB(id, userId).map { 
     case [email protected](user) => 
      credentials match { 
      case \/-(x) if x => 
       user.some 
      case _ => 
       None 
      } 
     case None => 
      None 
     } 
} 
+1

Где '' Future''? –

+0

Попробуйте вернуться 'Future {None}' not 'None' – Rumoku

+0

@Jean Logeart FunctionB propably возвращает Future. – Rumoku

ответ

3

Вы, ребята, просто увлеклись скалазом. Я собираюсь пометить эту страницу, чтобы показать людям на работе в качестве иллюстрации, почему мы не должны использовать все эти причудливые вещи.

Просто сделай это:

Try { 
     FunctionA(userId, password) 
    } 
    .toOption 
    .collect { case(true) => 
     FunctionB(id, userId) 
    } 
    .getOrElse(Future.value(None)) 
Смежные вопросы