2015-03-13 2 views
3

У меня есть будущее Scala, которое вызывает api и возвращает будущее, если результат неверен, тогда другой api-вызов будет отправлен с результатом первого будущего и возвращен как будущее.Ожидаемый возврат Scala на основе первого результата в будущем

Это то, что у меня есть до сих пор.

val fut1 = Future(queryFirst) 
val fut2 = fut1 map { 
    case y if y.isInstanceOf[NoResult] => Future(queryAgainWithFut1Result) 
    case x => x 
} 

Но если доступ FUT2 результат, это дает что-то вроде этого:

scala.concurrent.Await.result(fut2, 5 seconds) 
warning: there was one feature warning; re-run with -feature for details 
fut2: Any = [email protected] 

Есть ли способ, что я могу выбрать, чтобы вернуться FUT2 если FUT1 результат не является точным?

Редактировать: Второе будущее должно использовать первое будущее для продолжения вызова api. Это то, что у меня есть до сих пор.

val fut1 = Future("queryFirst") 
val fut2 = fut1 flatMap { 
    case y if y.isInstanceOf[Int] => Future("queryAgainWithResult(y)") 
    case x => Future(x) 
} 
+0

Знаете ли вы о 'recoverWith'? –

ответ

8

Вы можете filter первый Future, чтобы вызвать его на неудачу, когда его содержали результат не соответствует тому, что вы хотите, а затем использовать recoverWith восстановить значение другого Future.

Future(queryFirst) 
    .filter(result => /* logic that returns true if result is correct */) 
    .recoverWith { case NonFatal(e) => Future(querySecond) } 

Если queryFirst успешно и делает это через filter, то это результат будет возвращен (завернутые в Future).

Если queryFirst успешно и не имеет правильное значение в соответствии с filterили просто не удается, то результат Future(querySecond) будет возвращен, успех или неудачу.


Edit: В свете новой информации из ОП, если вам нужен результат неправильного первого Future, то вы на самом деле не было выбора, кроме как использовать flatMap.

Future(queryFirst).flatMap { 
    case result if(/* failed condition */) => Future(querySecond(result)) 
    case result => Future.successful(result) 
} 
+0

отличный ответ, удаляющий шахту –

+0

На самом деле, второе будущее должно использовать результат первого будущего, чтобы продолжить вызов api. Вы не будете работать, если я не получу доступ к результатам первого будущего. – angelokh

+0

@angelokh Вы должны действительно упомянуть важную информацию, например, первую .. –

Смежные вопросы