当使用async
管道上的可观察对象正在使用.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"
,正如我所料。我认为上面的行为是由于模板中的第一个表达式触发可观察的执行,并且一旦第二个表达式async
管道订阅了可观察的数据,数据已经消失了。这个解释正确吗?我怎样才能避免这种行为?
根据参考资料 https://angular.io/docs/ts/latest/api/common/index/AsyncPipe-pipe.html,
异步管道订阅 Observable 或 Promise 并返回其发出的最新值。
在 RxJS 4 中,shareReplay
用于实现所需的行为。
在 RxJS 5 中,直接对应shareReplay
is publishReplay
其次是refCount
(看解释 https://stackoverflow.com/questions/35246873/sharereplay-in-rxjs-5 and 讨论 https://github.com/ReactiveX/RxJS/issues/453).
所以应该是
data$ = (new Observable(observer => { ... }))
.publishReplay(1)
.refCount();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)