如果函数返回一个Observable.empty(),那么在执行此值的Observable.zip后我会得到什么?问题是我总是想在Observable.zip中执行代码,因为source2()可能会失败,我会执行一个catchError,然后返回一个空的observable。但我不确定拉链是否仍会使用此方法调用该块。
func source1() -> Observable<String> {
return Observable.just("test")
}
func source2() -> Observable<Int> {
return anObservableThatCanFail()
.catchError { error -> Observable<Int>
return Observable.empty()
}
}
func myFunc() {
Observable.zip(source1(), source2()) { string, integer
//this will be called despite source2() do a empty()?
//and if so, what integer contains?
}
答案 0 :(得分:4)
来自reactivex.io的文档:
它以严格的顺序应用此函数,因此新Observable发出的第一个项目将是应用于Observable#1发出的第一个项目和Observable#2发出的第一个项目的结果;新的zip-Observable发出的第二个项目是应用于Observable#1发出的第二个项目和Observable#2发出的第二个项目的结果;等等。它只会发出与发出最少项目的源Observable 发出的项目数一样多的项目。
所以在这个例子中,因为.empty()
会发出0项,这意味着zip
也会发出0项。
如果您确实需要执行压缩功能,可以将source2()
的类型从Observable<Int>
更改为Observable<Int?>
,而不是从.empty()
返回catchError
{1}}阻止,返回.just(nil)
。
func source2() -> Observable<Int?> {
return anObservableThatCanFail()
.map { (result: Int) -> Int? in result }
.catchError { error -> Observable<Int?>
return Observable.just(nil)
}
}