首页 文章

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

提问于
浏览
10

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

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

    window.setInterval(() => {
      observer.next(counter);
      counter++;
    }, 2000);
  }))
  .share();

模板:

{{ (data$|async) !== null }}
{{ (data$|async) !== null }}

初始值的输出是:

true false

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

true true

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

1 回答

  • 15

    根据the reference

    异步管道订阅Observable或Promise并返回它发出的最新值 .

    在RxJS 4中, shareReplay 用于实现所需的行为 .

    在RxJS 5中, shareReplay 的直接对应部分是 publishReplay ,后跟 refCountsee the explanationthe discussion) .

    所以它应该是

    data$ = (new Observable(observer => { ... }))
    .publishReplay(1)
    .refCount();
    

相关问题