shareReplay(config) 似乎没有共享订阅
shareReplay(config) does not seem to share subscription
假设此 Angular 代码:
import { Component } from '@angular/core';
import { shareReplay, tap, timer } from 'rxjs';
@Component({
selector: 'my-app',
template: '{{test$ | async}} {{test$ | async}}',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
test$ = timer(0, 1000).pipe(
shareReplay({ bufferSize: 1, refCount: true }),
tap(console.log)
);
}
为什么 console.log
出现两次并且订阅显然没有共享?
据我所知,shareReplay
的配置参数重载是当前推荐的明确共享订阅的方式。我是不是弄错了什么?
rxjs 7.5.2, ng 13.2
因为您实际上在代码中订阅了两次
template: '{{test$ | async}} {{test$ | async}}'
如果您将 tap
移动到 shareReplay
上方,它应该出现一次
shareReplay通过创建中间主题完成分享。
因此,
obs = source -> opratorA -> opB -> share(intermediate subjectC) -> opD -> opE
当你订阅obs时,你实际上订阅了subjectC,有opD和opE。
这样,opA和opB之后的stream是共享的,opD和opE的计算是不共享的。
const test$ = timer(0, 1000).pipe(
map(v => v * 2), // shared
tap(console.log), // shared
shareReplay({ bufferSize: 1, refCount: true }),
tap(console.log) // not shared
);
假设此 Angular 代码:
import { Component } from '@angular/core';
import { shareReplay, tap, timer } from 'rxjs';
@Component({
selector: 'my-app',
template: '{{test$ | async}} {{test$ | async}}',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
test$ = timer(0, 1000).pipe(
shareReplay({ bufferSize: 1, refCount: true }),
tap(console.log)
);
}
为什么 console.log
出现两次并且订阅显然没有共享?
据我所知,shareReplay
的配置参数重载是当前推荐的明确共享订阅的方式。我是不是弄错了什么?
rxjs 7.5.2, ng 13.2
因为您实际上在代码中订阅了两次
template: '{{test$ | async}} {{test$ | async}}'
如果您将 tap
移动到 shareReplay
上方,它应该出现一次
shareReplay通过创建中间主题完成分享。
因此, obs = source -> opratorA -> opB -> share(intermediate subjectC) -> opD -> opE
当你订阅obs时,你实际上订阅了subjectC,有opD和opE。
这样,opA和opB之后的stream是共享的,opD和opE的计算是不共享的。
const test$ = timer(0, 1000).pipe(
map(v => v * 2), // shared
tap(console.log), // shared
shareReplay({ bufferSize: 1, refCount: true }),
tap(console.log) // not shared
);