在使用.share()运算符的可观察对象上使用异步管道时(由于后端计算代价高昂),我偶然发现了以下行为:

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”,正如我所期望的那样。我认为上面的行为是因为模板中的第一个表达式触发了可观察的执行,一旦第二个异步管道订阅了可观察的,数据就已经消失了。这个解释正确吗?我怎样才能避免这种行为呢?

最佳答案

根据the reference
异步管道订阅一个可观察的或承诺,并返回它发出的最新值。
在rxjs 4中,shareReplay用于实现所需的行为。
在rxjs 5中,shareReplay的直接对应项是publishReplay然后是refCountsee the explanationthe discussion)。
所以应该是

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

10-05 19:22