我的AlertService有
private subject = new Subject<Alert>();
。
我想在5秒钟后专心清除警报。我可以这样使用setTimeout()
来做到这一点:
autoClear(alertId?: string) {
setTimeout(
() => this.subject.next(new Alert({alertId})),
5000);
}
我试图做得更优雅,并创建了以下代码:
autoClear(alertId?: string) {
const delay = new Observable(x => {
x.next();
}).delay(5000).subscribe(() => {
this.subject.next(new Alert({alertId}));
delay.unsubscribe();
});
}
两个示例都可以使用,但这似乎不是使用RxJS的正确方法。我该如何改善?
答案 0 :(得分:2)
new Observable(x => {
x.next();
}).delay(5000);
是正确的方法。 pipeables运算符的新方法是
new Observable(x => {
x.next();
}).pipe(delay(5000));
答案 1 :(得分:0)
也许使用timer
和take(2)
这样的版本更具可读性:
function autoClear(alertId: any) {
timer(0, 1000)
.pipe(
take(2),
)
.subscribe(i => i === 0
? subject.next(`start: ${alertId}`)
: subject.next('stop')
);
}
使用take(2)
,您可以很明显地看到只有两种状态。这两个subject.next()
通话是彼此相邻的,因此您可以稍后快速查看在next()
中发送的内容。
观看现场演示:https://stackblitz.com/edit/rxjs6-demo-8ez3af?file=index.ts