Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular,Socket.io:发射对象数组_Javascript_Node.js_Angular_Express_Socket.io - Fatal编程技术网

Javascript Angular,Socket.io:发射对象数组

Javascript Angular,Socket.io:发射对象数组,javascript,node.js,angular,express,socket.io,Javascript,Node.js,Angular,Express,Socket.io,使用Angular,我如何订阅这样的对象数组: [ 'abc/user2': { room: 'abc/user2', user: 'user2' }, 'abc/admin': { room: 'abc/admin', user: 'admin' } ] 目前这不起作用: this.socketService.onRoom().subscribe(rooms => { this.rooms = rooms; }); 使用socketService: publi

使用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));
    });
}
服务器端,console.log打印:

[
    'abc/user2': { room: 'abc/user2', user: 'user2' },
    'abc/admin': { room: 'abc/admin', user: 'admin' }
]
但是在
socketService
中的客户端,如果我在此处执行console.log(数据):

但如果我发出服务器端:

this.io.emit('room', Object.keys(this.rooms))
客户端it返回:

['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);
    });
}

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

您应该创建一个可观察的对象,您希望它返回到
套接字之外。
方法

public onRoom(): Observable<any> {
    BehaviorSubject<any> toReturn = new BehaviorSubject();
    this.socket.on('room', (data: any) => toReturn.next(data));
    return toReturn;
}
public onRoom():可见{
BehaviorSubject toReturn=新的BehaviorSubject();
this.socket.on('room',(数据:any)=>toReturn.next(数据));
回归回归;
}

然后,您可以订阅myObservable。

我终于设法解决了这个问题,没有发出对象数组,而只是发出一个对象

chat server.ts

//public rooms: Array<{room: string, user:string}> = [];
public rooms: any = {};
this.socketService.onRoom().subscribe(rooms => {
    this.rooms = rooms;
    this.roomsArr = Object.entries(this.rooms);

});

尽管如此,我还是不明白为什么我不能从socket.io中发出一个对象数组。

show-us-onRoom()方法在服务中。@VinkoVorih编辑;subscribe使用一个简单的字符串数组,但我无法使它使用对象数组
public onRoom(): Observable<any> {
    BehaviorSubject<any> toReturn = new BehaviorSubject();
    this.socket.on('room', (data: any) => toReturn.next(data));
    return toReturn;
}
private myArray = [
    'abc/user2': { room: 'abc/user2', user: 'user2' },
    'abc/admin': { room: 'abc/admin', user: 'admin' }
];
private myObservable= Observable.of(this.myArray);
//public rooms: Array<{room: string, user:string}> = [];
public rooms: any = {};
this.socketService.onRoom().subscribe(rooms => {
    this.rooms = rooms;
    this.roomsArr = Object.entries(this.rooms);

});