如果您不能保证您的operator将遵守 Rx 协议,例如因为您从多个源异步推送,则可以使用serialize运算符。serialize运算符会将不可靠的可观察量转换为合法的,顺序的可观察量。
让我们首先创建一个违反协议的observable并订阅它。
日志输出:
尽管我们的observable试图释放,但最终结果却遵守了Rx规格。之所以发生这种情况,是因为订阅(非常合理地)认为序列结束时订阅终止了订阅。这并不意味着我们将始终关注问题。还有一个名为unsafeSubscribe的方法,它不会自动取消订阅。
输出:
我们订阅者的预期行为与前面的示例相同(我们创建了一个Subscriber实例,因为unsafeSubscribe没有带lambda的重载)。但是,我们可以在这里看到我们没有取消订阅,我们一直收到通知。
unsafeSubscribe在其他方面也是不安全的,例如错误处理。它的用处是有限的。文档说它应该只用于使用嵌套订阅的自定义运算符。为了保护这些operator不接收和非法序列,我们可以应用serialize操作符。
输出:
我们看到,尽管我们没有取消订阅,但非法通知已被过滤掉。
下节再续!
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/7.%20Custom%20operators.md#lift