代码之家  ›  专栏  ›  技术社区  ›  13thang08

如何使用先前可观察链的结果?

  •  3
  • 13thang08  · 技术社区  · 6 年前

    在一些平面图链之后,我希望最终使用前面的所有结果,假设我有以下代码:

    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响应保存到out scope变量,然后使用后者?

    类似于:

    var api1Response: API1Response?
    func getObservable1() -> Observable<API1Response> {
        ...
    
        self.api1Response = api1Response
        ...
    }
    ...
    getObservable1()
        ...
        .subscribe(onNext: { api3Response  in
            // use ap1Response here
            print(self.api1Response)
        })
    

    谢谢

    -----更新-----

    基于@Misternewb answer,我发布了可运行的代码以供测试。

    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
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Misternewb    6 年前

    您可以尝试以下操作:

    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
    
        })
    }
    
        2
  •  0
  •   Mikhail Maslo    6 年前

    您需要按照先决条件的顺序做出响应,还是只需要成功完成所有响应?

    如果需要等待完成请求#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
      })
      ...