使用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);
    });
}


尽管还有许多其他方法(可能还有更好的方法)可以做到这一点。只是一个示例,因为我不知道您到底要完成什么。

10-06 07:43