我必须使用三个单独的 API 请求来获取三种类型的数据( AType
, BType
, )。CType
API 返回的对象是一对多的:
- 1 个
AType
对象是 N 个对象的父BType
对象 - 1 个
BType
对象是 P 个对象的父CType
对象)
我正在使用以下三个函数来获取每种类型:
func get_A_objects() -> Observable<AType> { /* code here */ }
func get_B_objects(a_parentid:Int) -> Observable<BType> { /* code here */}
func get_C_objects(b_parentid:Int) -> Observable<CType> { /* code here */}
并且为了避免嵌套订阅,这三个函数使用链接flatMap
:
func getAll() -> Observable<CType> {
return self.get_A_objects()
.flatMap { (aa:AType) in return get_B_objects(aa.id) }
.flatMap { (bb:BType) in return get_C_objects(bb.id) }
}
func setup() {
self.getAll().subscribeNext { _ in
print ("One more item fetched")
}
}
上面的代码工作正常,当有 M 个对象时AType
,我可以看到"One more item fetched"
打印 MxNxP 次的文本。
我想设置该功能getAll()
以使用. 我最初的想法是写如下内容:ReplaySubject<String>
func getAll() -> ReplaySubject<String> {
let msg = ReplaySubject<String>.createUnbounded()
self.get_A_objects().doOnNext { aobj in msg.onNext ("Fetching A \(aobj)") }
.flatMap { (aa:AType) in
return get_B_objects(aa.id).doOnNext { bobj in msg.onNext ("Fetching B \(bobj)") }
}
.flatMap { (bb:BType) in
return get_C_objects(bb.id).doOnNext { cobj in msg.onNext ("Fetching C \(cobj)") }
}
return msg
}
但此尝试失败,即以下内容print()
不打印任何内容。
getAll().subscribeNext {
print ($0)
}
我应该如何重写我的逻辑?