javascript - RxJS:延迟传入的 observables

标签 javascript angular typescript rxjs observable

我有一个 SnackbarComponent,它负责为用户显示带有信息的 Snackbar。通知来自我在 SnackbarComponent 中订阅的 NotificationService .传入的消息被推送到消息数组并在 3 秒后从它转移。在我的 html 模板中,我遍历消息并显示它们。

export class SnackbarComponent implements OnInit, OnDestroy {
  private notificationSubscription: Subscription;
  messages: NotificationMessage[] = [];

  constructor(private notificationService: NotificationService) {
  }

  ngOnInit() {
    this.notificationSubscription = this.notificationService.notification$
      .subscribe(
        (message: NotificationMessage) => {
          this.messages.push(message);
          setTimeout(() => {
            this.messages.shift();
          }, 3000);
        }
      )
  }

  ngOnDestroy(): void {
    this.notificationSubscription.unsubscribe();
  }

问题是,我想一次只显示 3 条消息并延迟其他消息(如果当前少于 3 条消息,则立即显示)。

我有一个看起来像这样的工作解决方案:
private notificationSubscription: Subscription;
messages: NotificationMessage[] = [];
messagesQueue: NotificationMessage[] = [];


  ngOnInit() {
    this.notificationSubscription = this.notificationService.notification$
      .subscribe(
        (message: NotificationMessage) => {
          if (this.messages.length < 3) {
            this.messages.push(message);
            this.timeoutMessage();
          } else {
            this.messagesQueue.push(message);
          }
        }
      )
  }

  private timeoutMessage() {
    setTimeout(() => {
      this.messages.shift();
      if (this.messagesQueue.length > 0) {
        this.messages.push(this.messagesQueue.shift());
        this.timeoutMessage();
      }
    }, 3000);
  }

如果有 3 条或消息,则将新消息推送到 messagesQueue 和 timeoutMessage() 中来自 messagesQueue 的对象被转移到消息数组。

但我觉得这个解决方案并不优雅。有没有一种 RxJS 方法可以通过一些 pipe 以某种方式延迟消息?运营商?

最佳答案

您可以使用 延迟 运算符或条件延迟 延迟时间根据条件延迟

import {delay} from 'rxjs/operators';

this.notificationService.notification$.pipe(
  delay(3000)
).subscribe();

为例延迟时间
this.notificationService.notification$.pipe(
  delayWhen(message => this.messages.length < 3 ? interval(0) : interval(3000))
).subscribe();

关于javascript - RxJS:延迟传入的 observables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028303/

相关文章:

html - Angular 6 bootstrap 4 - 导航栏品牌标志在向下滚动时不会改变

javascript - 如何在不使用 Angular 5 初始化的情况下正确地有条件地嵌入自定义组件?

Angular CLI 停止在浏览器控制台中给我合理的行(没有源映射),但终端显示正确的源

javascript - 如何让我的 Angular 应用程序在 'ng build --prod' 之后使用编辑的配置文件

javascript - 检查 react 输入表单的小数并更改值

javascript - 使用 angularJs 时 Django 表单实例不显示默认值

javascript - 在这种情况下如何更改下 3 个 sibling 的类(class)?

Angular 4, typescript 将接口(interface)属性分配给变量

来自原点的 Angular 和 WebApi Cors 请求已被 CORS 策略阻止

javascript - 如何显示显示 :none DIV using Javascript