Как использовать результат предыдущей наблюдаемой цепочки?

После некоторой цепочки flatMap я хочу использовать весь предыдущий результат в конце, предположим, у меня есть следующий код:

func getObservable1() -> Observable<API1Response> {

    ...
}

func getObservable2(param: API1Response) -> Observable<API2Response> {

    ...
}

func getObservable3(param: API2Response) -> Observable<API3Response> {

    ...
}

getObservable1()
    .flatMap { api1Response in
        return getObservable2(api1Response) 
    }
    .flatMap { api2Response in
        return getObservable3(api2Response) 
    }
    .subscribe(onNext: { api3Response  in
        // I want to use both of api1Response and api2Response here
    })

Как я могу это сделать?

Должен ли я сохранить ответ API на переменную области видимости, а затем использовать ее последнюю?

Что-то типа:

var api1Response: API1Response?
func getObservable1() -> Observable<API1Response> {
    ...

    self.api1Response = api1Response
    ...
}
...
getObservable1()
    ...
    .subscribe(onNext: { api3Response  in
        // use ap1Response here
        print(self.api1Response)
    })

Спасибо!

-----ОБНОВИТЬ-----

Основываясь на ответе @Misternewb, я публикую исполняемый код для тестирования.

func getObservable1() -> Observable<Int> {
    return Observable.of(1)
}

func getObservable2(num: Int) -> Observable<Int> {
    return Observable.of(num + 1)
}

func getObservable3(num: Int) -> Observable<Int> {
    return Observable.of(num + 10)
}


getObservable1()
    .flatMap { ret1 in
        return getObservable2(num: ret1).map { (ret1, $0) }
    }
    .flatMap { ret1, ret2 in
        return getObservable3(num: ret2).map { (ret1, ret2, $0) }
    }
    .subscribe(onNext: { ret1, ret2, ret3 in
        print(ret1)
        print(ret2)
        print(ret3)
    })

Выход

1
2
12

person 13thang08    schedule 19.04.2018    source источник


Ответы (2)


Вы можете попробовать следующее:

func getObservable1() -> Observable<API1Response> {
  return .empty()
}

func getObservable2(_ param: API1Response) -> Observable<API2Response> {
  return .empty()
}

func getObservable3(_ param: API2Response) -> Observable<API3Response> {
  return .empty()
}

func request() {
  getObservable1()
    .flatMap { api1Response in
      return getObservable2(api1Response).map { (api1Response, $0) }
    }
    .flatMap { api1Response, api2Response in
      return getObservable3(api2Response).map { (api1Response, api2Response, $0) }
    }
    .subscribe(onNext: { api1Response, api2Response, api3Response  in

    })
}
person Misternewb    schedule 19.04.2018
comment
Это то, что я ищу. Я добавил ваш исполняемый код в свой вопрос. Спасибо большое! - person 13thang08; 20.04.2018

Вам нужно, чтобы этот ответ был в предварительном порядке, или вам просто нужно успешно выполнить все из них?

Если вам нужно дождаться завершения запроса № 1 и запроса № 2, вы можете использовать

Observable.combineLatest(requestObservable1, requestObservable2)
  .flatMap { (requestResult1, requestResult2) -> Observable<You-Data-Type> in
     // Use result from request #1 & #2
     return requestObserver3
  }.subscribe(onNext: { (resultRequest3) in
  })
  ...
person Mikhail Maslo    schedule 19.04.2018
comment
Я хочу, чтобы ответ был в предварительном порядке. Observable2 использует ответ Observable1 в качестве параметра. На самом деле, в конце концов, я хочу использовать сразу оба из response1, response2, response3. Но ответ2 зависит от ответа1, а ответ3 зависит от ответа2. Спасибо! - person 13thang08; 19.04.2018