Я делаю вызов 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 итерируемым или нет?
Я думаю, вы хотите что-то вроде этого:
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) }
Думаю, да. Есть и другие альтернативы, такие как подписка на первую, которая подпишется на вторую. Но IMO использование flatMap намного лучше, так как мы можем поместить всю логику в одно место.
тогда, я думаю, вы можете подтвердить, что flatMap является оптимальным для этого варианта использования, верно?