使用Angular,我如何订阅这样的对象数组:
[
'abc/user2': { room: 'abc/user2', user: 'user2' },
'abc/admin': { room: 'abc/admin', user: 'admin' }
]
目前这不起作用:
this.socketService.onRoom().subscribe(rooms => {
this.rooms = rooms;
});
使用
socketService
:public onRoom() {
return new Observable<any>(observer => {
this.socket.on('room', (data: any) => observer.next(data));
});
}
编辑:
Mybad,看来问题出在服务器(NodeJS / express / socket.io):
chat-server.ts
:public rooms: Array<{room: string, user:string}> = [];
(...)
this.rooms[room] = {room: room, user: socket.user};
this.io.emit('room', this.rooms)
console.log('[server]rooms :', this.rooms)
服务器端console.log打印:
[
'abc/user2': { room: 'abc/user2', user: 'user2' },
'abc/admin': { room: 'abc/admin', user: 'admin' }
]
但是
socketService
中的客户端,如果我在这里做console.log(data):public onRoom() {
return new Observable<any>(observer => {
this.socket.on('room', (data: any) => {
console.log(data)
observer.next(data)
});
});
}
它返回:
[]
但是,如果我发出服务器端:
this.io.emit('room', Object.keys(this.rooms))
客户端返回:
['abc/user2', 'abc/admin']
看来我无法从socket.io发出对象数组?
最佳答案
你不能您必须将其变成某种可观察的形式。
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
export class AppComponent implements OnInit {
private readonly data = [
{
'abc/user2': { room: 'abc/user2', user: 'user2' }
},
{
'abc/admin': { room: 'abc/admin', user: 'admin' }
}
];
private data$;
ngOnInit() {
this.data$ = new Observable((observer) => {
observer.next(this.data);
observer.complete();
});
this.data$.subscribe(data => {
console.log(data);
});
}
尽管还有许多其他方法(可能还有更好的方法)可以做到这一点。只是一个示例,因为我不知道您到底要完成什么。