相关疑难解决方法(0)

Angular 2 + rxjs:与.share()运算符的异步管道

当在使用.share()运算符的observable上使用异步管道时(由于后端的昂贵计算),我偶然发现了这种行为:

data$ = (new Observable(observer => {
    let counter=0;
    observer.next(counter)

    window.setInterval(() => {
      observer.next(counter);
      counter++;
    }, 2000);
  }))
  .share();
Run Code Online (Sandbox Code Playgroud)

模板:

{{ (data$|async) !== null }}
{{ (data$|async) !== null }}
Run Code Online (Sandbox Code Playgroud)

初始值的输出是:

true false
Run Code Online (Sandbox Code Playgroud)

以下输出(超过2秒后)是:

true true
Run Code Online (Sandbox Code Playgroud)

这也是我对第一个值所期望的行为.如果省略.share(),则第一个值的输出为"true true",正如我所料.我想上面的行为是由于模板中的第一个表达式触发了可观察的执行,并且一旦第二个异步管道订阅了observable,数据就已经消失了.这个解释是否正确?我怎样才能避免这种行为?

rxjs angular

10
推荐指数
1
解决办法
3186
查看次数

带有行为主题和异步管道的Rxjs share()运算符-Angular

我有一个BehaviorSubject被观察为消耗:

testForStack$: Observable<boolean>;

ngOnInit(){
    const bs = new BehaviorSubject(true);
    this.testForStack$ = bs
      .asObservable()
      .do(t => console.log('subscribed'))
      .share();
}
Run Code Online (Sandbox Code Playgroud)

该可观察对象通过模板中的三个异步管道进行管道传输:

Sub1: {{testForStack$ | async}}<br>
Sub2: {{testForStack$ | async}}<br>
Sub3: {{testForStack$ | async}}
Run Code Online (Sandbox Code Playgroud)

问题是只有第一个(Sub1)获得true的值

Sub1: true
Sub2: 
Sub3:
Run Code Online (Sandbox Code Playgroud)

如果删除.share(),则所有三个值都将获得true值,但这会导致多个订阅问题。

关于为什么使用BehaviorSubject导致此行为的任何想法?它被用作观察对象,因此我假设上面的代码可以正常工作。

这也与此答案类似:

/sf/answers/2857359641/

rxjs angular

4
推荐指数
1
解决办法
1072
查看次数

标签 统计

angular ×2

rxjs ×2