主题/可观察性是否适合在Angular 2中的组件(页面)之间共享异步数据

时间:2016-10-17 12:47:33

标签: angular rxjs observable angular2-services

让我们说:

  1. 聊天室数组
  2. 每个房间都有一系列消息
  3. 其中的房间和消息通过WebSockets异步更改。
  4. 以“Angular2方式”解决问题的最佳方式是ReplaySubject Delegation: EventEmitter or Observable in Angular2

    我们必须订阅房间更改ChatService.rooms.subscribe(...,订阅邮件更改,然后取消订阅所有内容......

    在跨组件的服务中使用普通数组[]并且创建新的房间/消息只是为了将该数据推送到数组中时,这不是更好吗?

    或许我做错了什么。

    export class ChatService {
     private _rooms: ReplaySubject<Room[]> = new ReplaySubject(1);
     rooms: Observable<Room []> = this._rooms.asObservable();
    
     private socket;
    
     private _selectedRoom: ReplaySubject<Room> = new ReplaySubject(1);
     selectedRoom: Observable<Room> = this._selectedRoom.asObservable();
    
     constructor(private UserService:UserService) {
        this.socket = io.connect(window.location.origin, {
            'query': 'token=' + UserService.token
        });
        this.socket.on('existingRooms', (data) => {
            this._rooms.next(data.rooms);
        });
     }
    
     createNewRoom(string: string) {
         this.socket.emit('createNewRoom', {name: string});
    
         this.socket.on('newRoomCreated', (data) => {
             this._rooms.first().subscribe((rooms)=> {
                rooms.unshift(data)
                this._rooms.next(rooms);
             }, err => console.error);
         });
        }
    

    我无法使用BehaviorSubject,因为我没有初始值;

    我每次都要调用.first()来获取ReplaySubject的当前值。

    我必须订阅/取消订阅每个组件以避免内存泄漏。

0 个答案:

没有答案