Angular CanDeactivate Guard : How to wait for the right or the next value of an Obersavble?

标签 angular rxjs observable angular9 candeactivate

我有一个发出事件的服务:

export class MyService {
  private event = new BehaviorSubject<string>('init');
  event$ = this.event.asObservable();

  constructor() { }

  update(): void {
    this.event.next('update');
  }

  accept(): void {
    this.event.next('accept');
  }

  decline(): void {
    this.event.next('decline');
  }
}

我还有一个由组件中的函数触发的 CanDeactivateGuard:

canDeactivate(): Observable<boolean> {
  return this.service.event$.pipe(
    map(action => {
      return action === 'accept';
    })
  )
}

现在一切正常。但我有一个问题:

这将始终返回最后一个事件。因此,当没有发生任何事情时,它将立即发送init。如果update()被调用,它将直接发送update

我怎样才能让它工作,以便它:

  • ...等待接受拒绝发送?
  • ...等到下一个新事件发出?

最佳答案

您可以使用 skip 跳过 BehaviorSubject 的第一次发射:

this.service
  .pipe(
    skip(1),
    filter(a => ['accept', 'decline'].includes(a))
  )

关于Angular CanDeactivate Guard : How to wait for the right or the next value of an Obersavble?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60141007/

相关文章:

angular - 绑定(bind)到可观察数组

javascript - 如何在 Angular 2 中展平嵌套的 Observables

javascript - Angular4选择的选项在 "select"标签中选择后消失

angular - 无法从 BackdropClick 关闭 Angular Material Cdkoverlay

javascript - 将事件中的 Rx.Observable 与 pausable 一起使用不会运行订阅功能

firebase - 'FirebaseListObservable<any[]> 类型不存在属性 ‘indexOf’

java - 如何在 Angular 前端中从 REST-Backend 接收一个字符串

Angular 2 : is there a way to know when a component is hidden?

node.js - 如何在独立电脑上部署 Angular8 应用程序并隐藏代码

angular - 使用异步管道在 Angular 模板中解析自定义 rxjs 主题