当在使用.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,数据就已经消失了.这个解释是否正确?我怎样才能避免这种行为?
我有一个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导致此行为的任何想法?它被用作观察对象,因此我假设上面的代码可以正常工作。
这也与此答案类似: