public testFunction(name: string, model: string): Observable<any> {
return this.doSomething(name, model)
.flatMap((result: any) => {
return this.doSomethingElse()... // returning an Observable<any>
});
}
doSomething
是一个HTTP调用,实际上是自己返回一个Observable。
以下是我称之为方法:
public foo () {
this.testFunction(name, model)
.subscribe(
(result) => {
// do something
},
(error) => {
// do something wit the error
});
}
问题是:如果doSomething
HTTP调用在foo
内好坏,我怎么能抓住?
我不想使用Subject或Behavior主题,因为testFunction是服务的一部分而foo在一个组件上。我的意思是,不想添加“superstructure”来实现它。
答案 0 :(得分:1)
找到一个解决方案:通过拆分大的observable,我可以处理两个不同的onNext
而不是一个。{1}。
这让我知道第一种方法(doSomething
)何时结束
这里有一个傻瓜:https://plnkr.co/edit/crWpj8deQzePCrTtYz6k?p=preview
public testFunction(name: string, model: string): Observable<any> {
let obs1 = this.doSomething(name, model);
let obs2 = obs1.flatMap((data) => {
return this.doSomethingElse() //[...]
});
let merge = Observable.merge(obs1, obs2);
return merge
}
public foo () {
this.testFunction(name, model)
.subscribe(
(result) => {
// 1 - Obs1 next
// 2 - Obs2 next
},
(error) => {
// do something wit the error
});
}
答案 1 :(得分:1)
答案 2 :(得分:0)
您当前的代码完全符合您的要求。如果在DoSomethingElse中引发了onError,它将被发送到主流,并最终在foo()方法中的订阅onError中结束。
如果您希望更好地控制成功/错误的传播方式,您还可以执行以下操作:
public testFunction(name: string, model: string): Observable<any> {
return this.doSomething(name, model)
.flatMap((result: any) => this.doSomethingElse()
.map((doSomethingElseResult:any) => ({ result:'succes', data: doSomethingElseResult })
.catch(err => Rx.Observable.just({ result: 'do-something-else-error', error: err }))
)
.catch(err => Rx.Observable.just({ result: 'do-something-error', error:err });
}
如果类型为do-something-else-error