【发布时间】:2016-07-21 11:49:12
【问题描述】:
有一个websocket echo服务,可以发送和接收消息:
@Injectable()
export class NotificationsService {
private ws = new $WebSocket('wss://echo.websocket.org');
wsSendMessage(message: string = `Message ${Math.random()}`): void {
this.ws.send(message);
}
wsGetMessages(): Observable<string> {
return Observable.from(this.ws.getDataStream())
.map((res: any) => res.data);
}
}
Notifications 组件订阅此 observable 并在通知下拉面板中显示所有消息:
getMessages(): void {
this.notificationsService.wsGetMessages().subscribe(
(message: string) => {
this.messages.unshift(message);
},
(err: any) => console.log(err)
);
}
当通知下拉面板打开时,我需要在导航栏组件中显示未读消息的数量并将其设置为 0。而且我不知道该怎么做,所以我需要你的帮助......
附言
现在 websocket echo 服务是:
@Injectable()
export class NotificationsService {
private ws = new $WebSocket('wss://echo.websocket.org');
wsSendMessage(message: string = `Message ${Math.random()}`): void {
this.ws.send(message);
}
wsGetMessages(): Observable<Object> {
return Observable.from(this.ws.getDataStream())
.map((res: any) => res.data);
}
messagesReadStream(msgArray: Object[]): Observable<Object> {
return Observable.from(msgArray);
}
}
通知组件是:
export class Notifications implements OnInit {
messagesAll:string[] = [];
messagesRead:string[] = [];
newMessagesNumber:number = 0;
constructor(private notificationsService: NotificationsService) {
}
addMessage(): void {
this.notificationsService.wsSendMessage();
}
getMessages(): void {
this.notificationsService.wsGetMessages()
.subscribe(
(message: any) => this.messagesAll.unshift(message),
(err: any) => console.error(err)
);
}
readMessages(): void {
this.messagesRead = this.messagesAll.slice();
this.notificationsService.messagesReadStream(this.messagesRead)
.switchMap(() =>
this.notificationsService
.wsGetMessages()
.scan((unread, _) => unread + 1, 0)
.startWith(0))
.subscribe(
(count: number) => this.newMessagesNumber = count,
(err: any) => console.error(err)
);
}
ngOnInit(): void {
this.getMessages();
}
}
带模板:
<button type="button" class="btn btn-primary-outline btn-sm" (click) = "addMessage()">
Add message
</button>
<button type="button" class="btn btn-primary-outline btn-sm" (click) = "readMessages()">
Read messages
</button>
<div style="margin-top: 1rem">
<span class="circle bg-warning fw-bold">
{{newMessagesNumber}}
</span>
</div>
现在,如果我单击 button 'Add message',我的计数器不会从 0 更改值。只有当我单击button 'Add message',然后单击button 'Read messages',然后再次单击button 'Add message',计数器才开始正常工作。你能解释一下,问题是什么吗?
【问题讨论】:
-
哪个部分不工作?
-
wsGetMessages() 返回一个包含来自 websocket 服务器的所有消息的 Observable。我需要显示未读消息的数量。在我打开通知面板之前也是如此。但在它必须只计算新消息之后。我认为这将是另一个可观察到的所有已读消息。但是如何创建呢???
标签: angular reactive-programming rxjs rxjs5