我有一个流调用一个服务,该服务返回一个需要原始流信息的流。
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)接收参数,因此,我无法使用原始流信息来调用生成其他流的服务,我不喜欢在原始流上使用订阅并在订阅中返回一个新流,因为它有点乱码。
有什么建议吗?
答案 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}}
并在应用适当的关闭后得到了聊天结果。
我是否对测试可观测量有错误的形状,或误解了要求?