angular - 将角度异步管道与 BehaviourSubject/ReplaySubject 和 auditTime/debounceTime 一起使用
问题描述
我正在尝试使用角度异步管道订阅 BehaviourSubject/ReplaySubject。我还必须使用 auditTime 或 debounceTime 运算符来丢弃一些值。
这是一个示例(我使用 Angular CLI 版本 7.3.0 并仅更改了 app.component):
import {Component, OnInit} from '@angular/core';
import {Observable, ReplaySubject, Subject} from 'rxjs';
import {auditTime, tap} from 'rxjs/operators';
@Component({
selector: 'app-root',
template: `{{value$ | async}}`,
styleUrls: ['./app.component.less']
})
export class AppComponent implements OnInit {
private readonly subjectWithState: Subject<number>;
constructor() {
this.subjectWithState = new ReplaySubject(1);
}
ngOnInit(): void {
this.subjectWithState.next(42);
}
get value$(): Observable<number> {
return this.subjectWithState.asObservable()
.pipe(
tap(value => console.log(value)),
auditTime(1000),
);
}
}
问题是主题不会停止发出(单个)值,并且我没有得到任何输出(请参阅控制台日志)。使用简单的 Subject 或没有auditTime(1000) ,一切都按预期工作。
我找不到任何可以解释这种行为的东西。如何将 auditTime 或 debounceTime 运算符与异步管道和 BehaviourSubject 或 ReplaySubject 一起使用?
解决方案
每次视图访问 value$ 时,都会创建一个新的 observable。不要使用 getter 属性并创建一个属性,以便访问 observable 的相同实例。
value$ = this.subjectWithState.asObservable()
.pipe(
tap(value => console.log(value)),
auditTime(1000),
);
推荐阅读
- python - Python和C为算法返回不同的值
- ballerina - 错误:无法解析模块 'ballerina/sql'
- xml - XML to csv 做正确的 xslt
- php - Laravel socalite - 永远不会触发 handleProviderCallback
- android - 一段时间后呼叫检测广播接收器停止在后台工作
- ruby-on-rails-5 - 当代码不正确时应该引发错误
- spring - 如何在 intellij 中创建 gradle 和 spring 项目(终极版)
- android - Android:回收站视图的用户界面在项目点击时不会改变?
- sql - 仅显示行之间差异的 T-SQL 查询
- vue.js - 承诺 {
} 关于观看 Vuex 动作