Scala: функции перехвата для предоставления неявных параметров с Akka Futures

Итак, у меня есть серия вызовов функций, которые возвращают Akka Futures, и я объединяю их в цепочку с помощью flatMap и map следующим образом:

doAsyncCall(..).flatMap { res1 =>
  doAsyncCall2(..).flatMap { res2 =>
    doAsyncCall3(..).map { res3 =>
      res
    }
  }
}

которые могут быть распределены по различным вызовам функций. Теперь каждый из этих вызовов doAsyncCallX возвращает Future[Result], и я хотел бы иметь возможность составлять эти результаты, передавая их по цепочке, пока, в конце концов, я не верну составленный результат всех результатов в цепочке.

Для этого я подумал о том, чтобы каждый doAsyncCallX получал неявный параметр предыдущего результата и объединял полученный результат с предыдущим. Проблема в том, что я не могу найти способ сделать это, не засоряя использование моей библиотеки неявными значениями вроде этого:

doAsyncCall(..).flatMap { res1 =>
  implicit val implicitRes1 = res1
  doAsyncCall2(..).flatMap { res2 =>
    implicit val implicitRes2 = res2
    doAsyncCall3(..).map { res3 =>
      res
    }
  }
}

То, что я хотел бы сделать, это иметь возможность перехватить приложение flatMap, чтобы убедиться, что предыдущий ответ правильно передан как неявный параметр следующего вызова doAsyncCallX. Есть идеи, как этого добиться?

1 ответ

Возможно, я что-то упускаю, но есть ли причина использовать импликации вообще?

for(res1 <- doAsyncCall1(..);
    res2 <- doAsyncCall2(res1);
    res3 <- doAsyncCall3(res2)) yield(res3)

Если вам нужно вернуть результат, составляющий несколько промежуточных результатов, измените доходность, чтобы получить что-то другое, например, кортеж, например yield((res1,res2,res3)), Результатом которого будет что-то вроде Future[(Result1,Result2,Result3)]

Другие вопросы по тегам