通过示例的方式,对上面已经非常好的答案的另一种看法。
假设您有一个基于其内部状态返回 Observable 的类(用类似 Javascript 的伪语言编写,但适用于所有 ReactiveX 实现)
class DownloadManager {
var uuid = nil // this only gets set during runtime...say when a user performs a certain action
// fetches some data from the server.
func get() -> Observable<Data> {
if uuid == nil {
return .error(new DownloadUuidEmptyError())
}
return network.download(uuid, ...) // do something with the non nil uuid
}
}
这样写,方法可能被调用,并且 observable 在它实际被评估之前被传递,并且 uuid 可能在方法调用时不存在,但在订阅 Observable 时存在,从而产生错误.
let observable = manager.get()
// ... at some point, uuid is assigned to
// then we subscribe to our observable ...
observable.subscribe(...).disposedBy(bag) // errors!
在这种情况下,延迟可以派上用场,以确保在订阅时间之前不会进行评估(例如 uuid)。
// fetches some data from the server.
func get() -> Observable<Data> {
return Observable.defer {
if uuid == nil {
return .error(new DownloadUuidEmptyError())
}
return network.download(uuid, ...) // do something with the non nil uuid
}
}
现在,上面的示例将不再出错。也许更大的目标是确保您的代码永远不会达到这种状态,但有时它并不实用。这种模式对我来说很方便。