首先,我要感谢社区在使用新技术时像我一样获得的所有支持学习者。
我已经使用Angular一段时间了,有些事情我还是不太了解,也没有其他地方问过。

假设我有一个服务返回需要的数据的Observable,就性能而言,我应该如何正确使用这些数据?


我知道我可以使用异步管道并避免进行sub / unsub操作,但这仅发生在模板中。如果我还需要在组件中使用相同的数据怎么办?是否会再次订阅(从带有异步管道的模板和带有.subscribe()的组件进行订阅)?
如何保持可观测的最新状态?例如,我有一个表显示来自API的数据。如果我单击第二页(分页),我想打另一个电话,并更新可观察到的内容。


很抱歉,以前是否有人问过这个,我个人找不到是否在Stackoverflow上。感谢您的关注!

最佳答案

如果您还需要组件中的数据,则可以订阅它。但是也许你不应该(见下文)...
您可以在其中使用运算符,可以组合可观察对象来定义自定义数据流:


foo$: Observable < Foo[] > ;
randomClickEvent = new Subject < clickEvent > ();

ngOnInit() {
    let initialFetch = this.fooService.getData().share()
    this.foo$ = Observable.merge(
      initialFetch, // need the initial data
      initialFetch.flatMap(foos => {
        this.randomClickEvent.switchMap(() => { //listen to click events
          return this.fooService.getMore().map((moreFoos: Foo[]) => { //load more foos
            return foos.concat(...moreFoos) //initial foos values + new ones
          })
        })
      })
    );
  }


<span *ngFor="let foo of (foo$|async)">{{foo.name}}</span>
<button (click)="randomClickEvent.next($event)">Load More foos !</button>


大多数人只使用简单的运算符(例如map()do()等)来强制性地管理其订阅,但是通常最好不要订阅,这样可以避免许多副作用,并避免一些“糟糕的事情,我忘了在此处取消订阅”。通常,您无需订阅即可完成所需的一切。

存在可观察性来描述数据流,仅此而已。这是函数式编程的范式:您不定义事情的完成方式,而是事情的本质。在这里,this.foo$是初始fooService.getData()和可能出现的每个fooService.fetchMore()的组合。

08-18 02:28
查看更多