如何使用 RxSwift 在一个地方捕获来自两个请求的错误

Posted

技术标签:

【中文标题】如何使用 RxSwift 在一个地方捕获来自两个请求的错误【英文标题】:How to catch errors from two requests in one place using RxSwift 【发布时间】:2016-03-08 19:08:33 【问题描述】:

我很新,我想知道如何从一个地方压缩(见上面的片段)的请求中捕获错误。在当前的实现中,我在两个地方进行了错误处理,但我的目标是将它放在一个地方。我的请求已压缩,因为如果此请求之一失败,整个序列将失败,因此我希望在两个请求的代码中都有一个错误处理位置。

 let firstReq =  self.sendReq() // returns  Observable<Bool>
        .catchError 
            error in
            return self.just(true)
    

    let secondReq =  self.sendReqTwo() // returns  Observable<Bool>
        .catchError 
            error in
            return self.just(true)
    


    goBttnOutlet.rx_tap
        .subscribeNext 
          Observable.zip(firstReqRes, secondReqRes)  (firstRes, secondRes) -> Bool in
                return firstRes && secondRes
            .subscribeNext  summaryRes in
                print("???? \(summaryRes)")
            .addDisposableTo(self.rx_disposableBag)
        .addDisposableTo(rx_disposableBag)

..也许与示例代码的一些链接在常见的地方处理错误对我来说会很棒。 非常感谢。

【问题讨论】:

【参考方案1】:

zip 返回一个新的Observable&lt;T&gt;,因此您可以简单地将catchError 运算符应用程序移动到zip 返回的位置。

let firstReq =  self.sendReq()
let secondReq =  self.sendReqTwo()
let zippedReq = Observable.zip(firstReq, secondReq)
    .catchErrorJustReturn  _ in true 

goBttnOutlet.rx_tap
    .subscribeNext 
      zippedReq.subscribeNext  summaryRes in
            print("? \(summaryRes)")
        .addDisposableTo(self.rx_disposableBag)
    .addDisposableTo(rx_disposableBag)

附带说明,您可以将 goBttnOutlet 之后的链改进为以下内容

goBttnOutlet.rx_tap.flatMap  zippedReq 
    .subscribeNext  summaryRes in
        print("? \(summaryRes)")
    .addDisposableTo(rx_disposableBag)

详情请见flatMap documentation。

【讨论】:

以上是关于如何使用 RxSwift 在一个地方捕获来自两个请求的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxSwift 和 alamofire 获得嵌套 api 调用的响应?

如何使用 RxSwift 和 Alamofire 库调用来自另一个 API 的响应的 API?

在所有成员初始化之前由闭包捕获的 Swift5(+RxSwift) 'self'

如何使用 QAudioInput 从两个通道捕获音频信号

RxSwift 系列

RxSwift 观察模型的变化并提出请求