RxJava Zwrócenie Single na podstawie kilku innych

Odpowiedz Nowy wątek
2019-06-10 11:54
eL
0

Mam metodę która zwraca pewien obiekt (który jest Singlem z RX'a) na podstawie kilku zapytań z bazy danych. Wszystkie te metody zwracają Single i rezultatem też jest Single
Aktualnie wygląda to mniej więcej tak (piszę w Kotlinie ale nie ma to kompletnie znaczenia):

    api.getUser(id).flatMap { user -> 
            api.getAccesses(id).flatMap { accesses ->
                   api.getSomething(id).map { something ->
                           return Result(user, accesses, something)

Tych zapytań jest więcej bo koło 10 więc tworzy się takie dość spore drzewo zagnieżdżeń i wygląda to mega słabo. Pomyślałem sobie że to przerobie na coś takiego:

    val user = api.getUser(id)
    val accesses =  api.getAccesses(id)
    val something =  api.getSomething(id)

    return //Co dalej??

I nie bardzo wiem jak dalej zwrócić jakiś Result. Wynikiem tej metody nadal ma być Single więc nie chcę tu żadnych bloków robić ale nie wiem jak to teraz posklejać. Jakieś rady?

Pozostało 580 znaków

2019-06-10 12:00
0

Jakimś zipem nie da rady?

edytowany 1x, ostatnio: baant, 2019-06-10 12:01

Pozostało 580 znaków

2019-06-10 12:08
0

A nie jesteś wstanie tego przerobić, tak, żeby jednym zapytaniem wszystko dostać? Ewentualnie zebrać dane 'niżej' i zwrócić je jako jedno single już potem? ewentualnie coś pokombinować z then


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.

Pozostało 580 znaków

2019-06-10 12:11
1

Jednym ładnym chainem ciężko, bo z takim API z każdym zapytaniem tracisz wynik poprzedniego zapytania :p Jak masz te vary, to coś takiego jak Single.zip(user, access, something, funkcja_ktora_to_polaczy_w_nowego_singla) powinna ogarnąć

edytowany 1x, ostatnio: baant, 2019-06-10 12:12

Pozostało 580 znaków

2019-06-10 12:21
0

Nie jestem mistrzem Kotlina, ale zdaje się, że problem rozbija się o to, że Kotlin nie ma for comprehension
Są jakieś tricky na to i monady, ale czy to działą to nie wiem.
W Scali, która ma for comprehension można by napisać:

for {
  user <- api.getUser(id)
  accesses <-  api.getAccesses(id)
  something =  api.getSomething(id)
} yield Result(user, accesses, something)

Chociaż to tak naprawdę i tak jest tylko lukier składniowy i zostanie skompilowane do tej samej postaci którą napisałeś.


edytowany 1x, ostatnio: Kamil Żabiński, 2019-06-10 12:21

Pozostało 580 znaków

2019-06-10 12:25
1
Kamil Żabiński napisał(a):

Nie jestem mistrzem Kotlina, ale zdaje się, że problem rozbija się o to, że Kotlin nie ma for comprehension
Są jakieś tricky na to i monady, ale czy to działą to nie wiem.
W Scali, która ma for comprehension można by napisać:

for {
  user <- api.getUser(id)
  accesses <-  api.getAccesses(id)
  something =  api.getSomething(id)
} yield Result(user, accesses, something)

Chociaż to tak naprawdę i tak jest tylko lukier składniowy i zostanie skompilowane do tej samej postaci którą napisałeś.

Wydaje się, że problemem nie jest brak for comprehension tylko fakt, że modelowane jest to za pomocą flatMap (czy to są monady spełniające prawa -> nie wiem), które definiują operacje w sposób sekwencyjny. To o co się pyta autor to jest zbiór wielu, niezależnych operacji więc Applicative. Czy te są dostępne w RxJava - nie mam pojęcia, nigdy się nie interesowałem, ale może warto poszukać w tym kierunku.

edytowany 3x, ostatnio: DisQ, 2019-06-10 14:23

Pozostało 580 znaków

2019-06-10 13:51
eL
DisQ napisał(a):

To o co się pyta autor to jest zbiór wielu, niezależnych efektów więc Applicative.

Dokładnie tak.
W każdym razie problem solved.

Sam dopiero uczę się Rx'a ale wykorzystałem zip tak jak proponował @baant i wyszło coś na takiej zasadzie:

Single.zip(
    val user = api.getUser(id)
    val accesses =  api.getAccesses(id)
    val something =  api.getSomething(id)
   funkcjaKtoraSklejaResult
)

Póki co śmiga więc myślę że jest okej.

edytowany 1x, ostatnio: eL, 2019-06-10 13:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0