(如果以下代码中的某些内容对您来说看起来很奇怪:它源自于一个学习性质的业余项目;我仍在学习RxJS)
我有一个组件,其中包括一个getter和一个构造函数。两者都从应用程序的ngrx存储中读取信息并提取一个字符串(name)。
getter和构造函数之间唯一的区别: getter在HTML中使用,返回的observable通过async管道发送,而构造函数中的observable映射则通过subscribe完成订阅。我期望它们都会在新值变为可用时触发。
但实际上只有getter以这种方式工作,并在HTML中与name的新值一起使用async管道提供(console.log('A')对于每个名称更改都被调用)。subscribe订阅的回调仅被调用一次:console.log('B')和console.log('B!')都只被调用一次,然后再也没有调用过。
如何解释这种行为差异?
来自我的组件的片段:
// getter works exactly as expected:
get name$(): Observable<string> {
console.log('getter called')
return this.store
.select(this.tableName, 'columns')
.do(_ => console.log('DO (A)', _))
.filter(_ => !!_)
.map(_ => _.find(_ => _.name === this.initialName))
.filter(_ => !!_)
.map(_ => {
console.log('A', _.name)
return _.name
})
}
// code in constructor seems to lose the subscription after the subscription's first call:
constructor(
@Inject(TablesStoreInjectionToken) readonly store: Store<TablesState>
) {
setTimeout(() => {
this.store
.select(this.tableName, 'columns')
.do(_ => console.log('DO (B)', _))
.filter(_ => !!_)
.map(_ => _.find(_ => _.name === this.initialName))
.filter(_ => !!_)
.map(_ => {
console.log('B', _.name)
return _.name
})
.subscribe(_ => console.log('B!', _))
})
}
额外信息:如果我添加了ngOnInit
,则此生命周期钩子在整个测试期间仅调用一次。如果我将订阅从构造函数移至ngOnInit
生命周期钩子中,则其与从构造函数中进行订阅一样无效。完全相同(意外的)行为。对于ngAfterViewInit
和其他生命周期钩子也是如此。
更改名称的输出'some-name' -> 'some-other-name' -> 'some-third-name' -> 'some-fourth-name' -> 'some-fifth-name'
:
[更新] 如Pace在他们的评论中建议的那样,我添加了getter调用日志
[更新] 如Pace所建议的,添加了do
。
getter called
DO (A) (3) [{…}, {…}, {…}]
A some-name
DO (B) (3) [{…}, {…}, {…}]
B some-name
B! some-name
getter called
DO (A) (3) [{…}, {…}, {…}]
A some-other-name
getter called
DO (A) (3) [{…}, {…}, {…}]
A some-third-name
getter called
DO (A) (3) [{…}, {…}, {…}]
A some-fourth-name
getter called
DO (A) (3) [{…}, {…}, {…}]
A some-fifth-name
< p >在< code >do中使用console.log
打印输出的示例内容:
[
{
"name": "some-name"
},
{
"name": "some-other-name"
},
{
"name": "some-third-name"
}
]
似乎在第一次订阅调用后,subscribe
订阅就会丢失。但为什么呢?
do
来查看新事件是否被过滤掉了吗? - PaceinitialName
的值吗? - bygrace