Metoda traverse
od Future
obiekt zatrzymuje się przy pierwszym uszkodzeniu. Chcę tolerancyjną/wybaczającą wersję tej metody, która po wystąpieniu błędów przenosi się z resztą sekwencji.Jak kontynuować wykonywanie sekwencji Przyszłości mimo niepowodzenia?
Obecnie dodaliśmy następujące metody do naszych utils:
def traverseFilteringErrors[A, B <: AnyRef]
(seq: Seq[A])
(f: A => Future[B]): Future[Seq[B]] = {
val sentinelValue = null.asInstanceOf[B]
val allResults = Future.traverse(seq) { x =>
f(x) recover { case _ => sentinelValue }
}
val successfulResults = allResults map { result =>
result.filterNot(_ == sentinelValue)
}
successfulResults
}
Czy istnieje lepszy sposób to zrobić?
super. Czy mógłbyś skomentować, dlaczego alternatywa ('f.map (Success ...') jest mniej wydajna? – sourcedelica
Ponieważ 'map' oraz' recover' tworzą instancje 'Promise' i zwracają ich powiązaną' Future'. Instancje "obiecujące" zamiast jednej dla mojego alternatywnego rozwiązania, a "zwięzła" wersja rozpakowuje instancję 'Try' (przechowywaną wewnątrz instancji' Promise') tylko po to, aby ją ponownie zrewidować jako 'Success' lub' Failure 'instancja, która jest trochę marnotrawna Oczywiście musisz profilować, aby zobaczyć, czy faktycznie robi on jakąś znaczącą różnicę –
Dzięki! To jest naprawdę pomocne – sourcedelica