当且仅当生产者 A 不抛出错误时,如何执行生产者 B?



我正在尝试处理以下方案我有两个生产者A和B。 producerB仅在成功执行producerA时才执行,并且如果producerA引发错误,处理错误并停止此处。所以我尝试了这样的事情。

producerA.flatMapError {
    // handle error and stop right here 
}.then(producerB).startWithResult { 
    // ...
}

即使producerA丢弃错误,也看起来像producerB执行。请帮助我如何使其与我的方案一起使用。

问题是,您的意思是"不丢失错误"。

Signal/SignalProducer上事件的顺序具有精确定义的语义

有任意数量的Value(来自0- X)事件,最终是completedfailedinterrupted事件。之后,没有更多的事件。

通常,您可以说大多数操作员仅在value事件上操作,并立即传播failed事件(无需操作)。如果您不确定特定操作员,请查看该操作员的文档,这很清楚故障事件的行为。


因此,一种理解问题的方法是说 producerA成功完成(在任意数量的value事件之后)时,请启动producerB,如果producerA发送failed事件,则不要。

在这种情况下,then操作员正是您所需的。producerA完成后,它将启动producerB,但是如果producerA失败!

producerA.then(producerB)
  .start(Signal.Observer(value: { value in
    print("Value (value)")
  }, failed: {error in
    print("Error (error)")
  }))

请注意,您 dont 想要在此处使用flatMapError,因为这将(取决于块中的错误处理方式)将failed事件转换为value最终触发producerB的事件。bk_hr>

理解问题的另一种方法是说 producerA上的每个事件都不是错误,应该触发producerB

在这种情况下,您将在producerA的事件上使用flatMap返回producerA上的每个事件的producerB。再次注意,再次,flatMap立即传播failed事件,因此producerA上的failed事件将导致整个链失败没有producerB

执行的情况。
producerA.flatMap(.concat) { _ in return producerB }
  .start(Signal.Observer(value: { value in
    print("Value (value)")
  }, failed: {error in
    print("Error (error)")
  }))

尝试以下:

func scenario() -> SignalProducer<MyValueType, MyErrorType> {
        return SignalProducer { observer, _ in
            producerA.startWithResult({ (res) in
                switch res {
                case .success(let value):
                    observer.send(value: value)
                    observer.sendCompleted()
                case .failure(let error):
                    print(error)//handle your error here
                    observer.send(error: err)
                }
            })
        }.then(producerB)
    }
scenario().start()

您创建一个自定义信号生产者并通过告诉观察者根据您的方案操作来定义所需的行为。

相关内容

  • 没有找到相关文章

最新更新