【问题标题】:Observable best practice可观察的最佳实践
【发布时间】:2019-04-24 07:32:33
【问题描述】:

在我当前的项目中,我有一个可观察的返回值,我必须根据可观察的返回值更新我的局部变量。

我看到了两种方法,要么直接订阅我的 observable,要么使用 pipable 运算符。

根据您的经验/知识,最佳做法是什么?

第一种方法(直接订阅):

this.myObservable$.subscribe(value=> {
  this.myValue = value;
});

第二种方法(使用 pipable 运算符):

this.myObservable$.pipe(
    tap(value=> this.myValue = value)
  ).subscribe();

【问题讨论】:

  • 我认为 SO 不是问它的正确地方。在这里试试:codereview.stackexchange.com
  • 鉴于第一个更简单,您为什么要考虑第二个?除非您确实需要应用一些转换,否则地图是多余的。
  • 第一个是正确的。 map 用于将一个值映射到从其回调返回的另一个值,它不应执行任何副作用。
  • 因为 Observables 是惰性的 - 它们在订阅之前不会启动 - 所以你应该使用 .subscribe 来执行一些操作

标签: angular rxjs rxjs-pipeable-operators


【解决方案1】:

我认为两者都是有效的,但在这种特殊情况下,我将使用第一种方法并在订阅块中完成工作。原因是意图更清晰。

"tap" 是用来做副作用的,但是你在这里没有做副作用,因为在点击之后没有更多的逻辑发生。您正在做的是使用未包装的最终值来做某事,这就是订阅块的用途。

【讨论】:

  • this.myValue = value; 实际上是一个副作用。建议使用tap
【解决方案2】:

如果必须强制更新局部变量,我会考虑在 pipe 中执行此操作。我可能对同一个 observable 有多个订阅,我可能忘记更新其中任何一个中的局部变量。在 Observable 中处理这一点很好。

myOb$ = this.myObservable$.pipe(
    tap(value=> this.myValue = value)
)

就你的情况而言,如果你没有对 Observable 进行任何更改,你可以使用 tap() 而不是 map()

考虑到你想更新一个类的变量,其中 Observable 存在而不是它被订阅的地方,那么这就是你要走的路。比如说,一个 Observable 存在于一个 Service 中,并且多个组件正在订阅它,在每次发射之后,必须更新该服务的一个变量。

如果局部变量属于订阅 Observable 的类,那么在管道中这样做当然没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 2020-05-18
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多