Несколько вызовов RxJava Retrofit2 API с использованием подписки или плоской карты

Я делаю вызов API, используя Retrofit2 и RxJava. Дело в том, что я хочу сделать второй вызов API с ответом (в данном случае целым числом), полученным от первого вызова API. Мое сомнение касается того, что оба

Disposable subscribe(@NonNull Consumer<? super T> onSuccess, @NonNull Consumer<? super Throwable> onError) метод и

    <R> Single<R> flatMap(@NonNull Function<? super T, ? extends SingleSource<? extends R>> mapper

похоже, что они могут использовать результат первого вызова API для вызова второго вызова API. Итак, какой метод, subscribe или flatMap, я должен использовать, чтобы сделать второй вызов API с результатом первого и почему? Должен ли я использовать один или другой в зависимости от того, является ли результат первого вызова API итерируемым или нет?

1
0
251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы хотите что-то вроде этого:

fun firstRequest(): Single<Int> = Single.just(10)

fun secondRequest(valueFromFirst: Int): Single<Int> = Single.just(valueFromFirst*2)

fun mappedRequest(): Single<Int> {
  return firstRequest().flatMap {
    secondRequest(it)
  }
}

Итак, теперь вы можете иметь доступ к mappedRequest() отовсюду. Вы можете «подготовить» свой запрос, выполнив следующие действия:

val requestSingle = mappedRequest()

В этом случае у вас есть только сингл. Запрос еще не запущен, но готов к выполнению. Чтобы эффективно запустить его:

requestSingle.subscribe { handleResult(it) }

тогда, я думаю, вы можете подтвердить, что flatMap является оптимальным для этого варианта использования, верно?

mantc_sdr 11.12.2020 10:25

Думаю, да. Есть и другие альтернативы, такие как подписка на первую, которая подпишется на вторую. Но IMO использование flatMap намного лучше, так как мы можем поместить всю логику в одно место.

iuricernov 14.12.2020 04:05

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