【问题标题】:Get event from inner observable从内部 observable 获取事件
【发布时间】:2016-12-02 17:14:00
【问题描述】:
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
                     });
}

问题是:我如何才能从foo 中发现doSomething HTTP 调用是好是坏? 我不想使用 Subject 或 Behavior 主题,因为 testFunction 是服务的一部分,而 foo 在组件上。我的意思是,不想添加一个“上层结构”来实现它。

【问题讨论】:

  • “在foo内”是指在方法返回之前?
  • 没错,只要 doSomething 调用顺利。

标签: http rxjs reactive-programming observable


【解决方案1】:

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

Notify from inner flatMap

非常简单,您不必合并不同的 observables。

【讨论】:

  • 谢谢,看起来不错!
【解决方案2】:

找到了一个解决方案:通过拆分那个大的 observable,我可以处理两个不同的 onNext 而不仅仅是一个。 这让我知道第一种方法 (doSomething) 何时结束。
这里有一个 plunkr: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
                     });
}

【讨论】:

    【解决方案3】:

    您当前的代码完全符合您的要求。如果在 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 });
    }
    

    这会将所有错误转换为 onNext 值,如果类型为 do-something-else-error,则这些值具有供您处理的类型

    【讨论】:

    • 嗨,马克,感谢您的回复。这并不完全是我想要实现的目标:每当我订阅 testFunction 时,如果 doSomething 进展顺利,我希望得到注意。在我的订阅中,我只收到在 testFunction 结束时获得的 onNext 事件,而不是 doSomething 上的事件。顺便说一句,如果我必须处理错误等类似问题,那没问题。
    • 我想了解您的要求。您还需要doSomethingElse 的输出吗?还是您只对第一个结果感兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多