RxSwift: завершаемое concat с отложенным способом - PullRequest
1 голос
/ 03 февраля 2020

Может кто-нибудь сказать мне, возможно ли создать отложенный завершаемый в операторе concat.

Я хочу получить сеанс и после этого загрузить пользователя с соответствующим идентификатором сеанса.

SessionAPI.post(email: email, password: password)
UserAPI.get(id: Session.load()!.userId)

До сих пор я использовал наблюдаемые с оператором flatMap.

Теперь я попытаюсь воспроизвести то же поведение с завершаемыми, у которых нет оператора flatMap.

Рабочий код с наблюдаемыми:

SessionAPI.post(email: email, password: password)
          .flatMap { (_) -> Single<Any> in
              return UserAPI.get(id: Session.load()!.userId)
          }

Новый рабочий код с завершаемыми

SessionAPI.post(email: email, password: password)
          .concat(Completable.deferred { UserAPI.get(id: Session.load()!.userId) } )

Теперь я хочу создать расширение для этого отложенного завершаемого типа, например:

SessionAPI.post(email: email, password: password)
          .concatDeferred(UserAPI.get(id: Session.load()!.userId))

Текущее расширение:

extension PrimitiveSequenceType where Self.Element == Never, Self.Trait == RxSwift.CompletableTrait {

    func concatDeferred(_ second: RxSwift.Completable) -> RxSwift.Completable {
        return Completable.deferred { () -> PrimitiveSequence<CompletableTrait, Never> in
            return second
        }
    }
}

Проблема: Session.load ()! в UserAPI.get загружается и аварийно завершает работу до завершения SessionAPI.post.

У кого-нибудь появилась идея запустить это расширение?

Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2020

Я собираюсь предположить, что причина, по которой вы хотите отложить ваше UserAPI.get(id:), заключается в том, что на заднем плане происходит какое-то "волшебство c", когда SessionAPI.post(email:password:) делает его таким, чтобы Session.load() действовал.

Это говорит мне о том, что post(email:password:) должен не быть в первую очередь завершаемым. Скорее он должен возвращать Observable<T>, где T - это то, что возвращает Session.load ().

Вы не можете заставить код работать так, как вы хотите:

SessionAPI.post(email: email, password: password)
    .concatDeferred(UserAPI.get(id: Session.load()!.userId))

С указанным выше кодом, Session.load() будет вызван до того, как SessionAPI.post(email:password:) будет вызван, независимо от того, какой код вы ввели concatDeferred.

Функция Session.load() должна быть вызвана до того, как concatDeferred будет таким, чтобы первый мог передать свой результат во второй.

...