Rxjs:将两个流合并为一个依赖于另一个流的流

时间:2017-11-06 16:46:46

标签: javascript angular stream rxjs

我有一个流调用一个服务,该服务返回一个需要原始流信息的流。

this.messages$ = this.selectedChat$
.switchMap(chat => this.chatService.subscribeMessages(chat.room))
.map(messages) =>
  messages.map((message: any) => {
    //Here need add information of the chat object
    return message;
  })
);

我看到的所有操作符都可以合并流并稍后将其分开(如combineLatest)接收参数,因此,我无法使用原始流信息来调用生成其他流的服务,我不喜欢在原始流上使用订阅并在订阅中返回一个新流,因为它有点乱码。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

使用selector function操作中的switchMap

this.messages$ = this.selectedChat$
.switchMap(chat => this.chatService.subscribeMessages(chat.room), 
(chat,messages)=>({chat,messages})) // create a new object, using the inner observable and the mapped one
.map(data =>
  data.messages.map((message: any) => {
    // Here data.chat has the chat information
    return message;
  })
);

有关switchMap运算符检查here

的详细信息

答案 1 :(得分:1)

那样的东西?

this.messages$ = this.selectedChat$
.switchMap(chat => {
// chat still within the scope
  return this.chatService.subscribeMessages(chat.room))
    .map(messages) =>
       messages.map((message: any) => {
       //Here need add information of the chat object
       return message;
     })
});

如果您坚持传递变量,可以尝试

this.messages$ = this.selectedChat$
.switchMap(chat =>this.chatService.subscribeMessages(chat.room).combineLatest(Observable.of(chat)))
    .map([messages,chat]) =>
       messages.map((message: any) => {
       //Here need add information of the chat object
       return message;
     })
});

如果需要太多全局值,您还可以使用行为主题设置全局变量存储

答案 2 :(得分:1)

我知道这个问题已经得到了解答,但我很好奇 - 看起来好像混淆了括号和丢失的回报。

原件:

.map(messages) =>

这看起来像拼写错误const selectedChat$ = Observable.of({ room: '1', chatter: 'me', chattee: 'you' }) const subscribeMessages = (room) => Observable.of(['msg1', 'msg2']) const messages$ = selectedChat$ .switchMap(chat => subscribeMessages(chat.room) .map(messages => { return messages.map(message => { //Here need add information of the chat object return [message, chat]; }) }) ) messages$.subscribe(console.log)

我试过这个

{{1}}

并在应用适当的关闭后得到了聊天结果。

我是否对测试可观测量有错误的形状,或误解了要求?