从内部可观察中获取事件

时间:2016-12-02 17:14:00

标签: http rxjs reactive-programming observable

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”来实现它。

3 个答案:

答案 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)

您可以查看我的解决方案:

Notify from inner flatMap

非常简单,您不必合并不同的可观察量。

答案 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

,这会将所有错误转换为onNext值,这些值具有您要处理的类型