如何延迟主题的下一个(值)?

时间:2018-07-25 10:33:16

标签: angular rxjs angular5 rxjs5 subject

我的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的正确方法。我该如何改善?

2 个答案:

答案 0 :(得分:2)

new Observable(x => {
  x.next();
}).delay(5000);

是正确的方法。 pipeables运算符的新方法是

new Observable(x => {
  x.next();
}).pipe(delay(5000));

答案 1 :(得分:0)

也许使用timertake(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