angular - 如何在 switchMap 中使用过滤器?

标签 angular typescript rxjs

我有一个 observable,它应该监视每个类型为 'private'

的聊天消息

所以我想做的是使用 rxjs 中的函数 filter() 来观察每个类型为 private 的聊天消息,这样我就可以使用它在我的变量 chatMessagePrivate$

这是我尝试过的:

export type ChatType = 'private' | 'standard';

export class ChatMessage {
  uid?: string;
  chatRoomUid: string;
  type: ChatType;
}

chatMessagePrivate$: Observable<ChatMessage[]>;

ngOnInit() {
  this.chatMessagePrivate$ = this.chatRoom$.pipe(
    switchMap((chatRoom: ChatRoom) => this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid) // this function returns every message from the uid of the chatroom
      .filter(chatRoom => 'private')
      )
    );
}

我收到以下错误:Type 'string' is not assignable to type 'boolean'

如何使用 filter() 获取类型为 'private' 的所有 ChatMessage?

最佳答案

filter 的 RxJS v6+(我假设你使用的是 v6+)是一个管道运算符。所以你需要像这样使用它:

this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
   filter(cr => cr.type === 'private')
);

进一步阅读:https://www.learnrxjs.io/operators/filtering/filter.html


更新:

由于响应是一个数组,你需要使用Array.filter。你可以像下面那样做:

this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
   map(crArr => crArr.filter(cr => cr.type === 'private'))
);

关于angular - 如何在 switchMap 中使用过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57770645/

相关文章:

Angular/PrimeNg : Focus on input each time I open a p-dialog

javascript - 如何在 ng-select 中初始设置一个值?

javascript - 具有依赖类型的 Typescript 联合

RxJs 好教程

angular - 订阅多个异步 http 调用

angular - 何时在 Angular 中使用模板驱动和响应式表单

typescript - "Type-only Field Declarations"有什么实际用途?

javascript - 如何在不创建新函数的情况下将参数传递给 React + Typescript 中的回调?

typescript - 通过主要版本更新包依赖是否需要包本身的主要版本?

angular - 在 RxJs 5 中共享 Angular Http 网络调用结果的正确方法是什么?