我正在尝试使用以下方案
我有两个生产者A和B.
producerB
只应在producerA
成功执行时执行,如果producerA
抛出错误,则处理错误并停在那里。所以我试过这样的事情。
producerA.flatMapError {
// handle error and stop right here
}.then(producerB).startWithResult {
// ...
}
即使producerB
引发错误,看起来producerA
也会执行。
请帮助我如何使其与我的方案一起使用。
答案 0 :(得分:1)
问题是,确切地说,你的意思是"不会引发错误"。
Signal
/ SignalProducer
上的事件序列有precisely defined semantic
Theres是任意数量的Value
(来自0 - x)事件,最后是completed
,failed
或interrupted
事件。之后不再有事件了。
通常,您可以说大多数运算符仅对value
个事件进行操作,并立即传播failed
个事件(不对其进行操作)。如果您不确定某个特定的操作员,请查看该操作员的文档,该文档非常清楚故障事件的行为。
因此,理解这个问题的一种方法是在producerA
成功完成时(在任意数量的value
事件之后)说,然后启动producerB
以及{{1}发送producerA
事件,然后不要发送。
在这种情况下,failed
运算符正是您所需要的。它会在then
完成后立即开始producerB
,但如果producerA
失败,则不!
producerA
请注意,您不想要在此处使用producerA.then(producerB)
.start(Signal.Observer(value: { value in
print("Value \(value)")
}, failed: {error in
print("Error \(error)")
}))
,因为这会(取决于您在块中的错误处理方式)将flatMapError
个事件转换为{{ 1}}最终会触发failed
的事件。
理解这个问题的另一种方法是说 value
上的每个事件都不是错误,应该触发producerB
一次
在这种情况下,您可以对producerA
的事件使用producerB
为flatMap
上的每个事件返回producerA
。请注意,producerB
会立即传播producerA
事件,因此flatMap
上的failed
事件会导致整个链失败而不会执行 failed
producerA