【问题标题】:How can two Components subscribe to the same Event?两个组件如何订阅同一个事件?
【发布时间】:2019-04-28 09:00:25
【问题描述】:

我有一个 Client 服务,其中包含一个包含服务器消息的数组 "messages"。然后我有一个组件订阅该数组并检查每条新消息的主题。

像这样:

client.messages.subscribe(msg => {
  switch (msg.SUBJECT)
  {
    case 'SOME_TEXT':
      //some code;
      break;
    default:
      console.log(msg);
      break;
  }
                                 });

但是,当我使用相同的代码(唯一的区别是开关中的主题)为该数组订阅第二个组件时,只执行第一个组件的开关。

第二个组件永远不会收到消息。

代码应该是正确的。该消息仅由项目树中的第一个组件接收。

正如您请求 ClientService 的代码,这里是:

import { Injectable } from '@angular/core';
import { WebsocketService } from './websocket.service';
import { Subject } from 'rxjs';
import { map } from 'rxjs/operators';

const CHAT_URL = //MY IP AND PORT;



export interface Message {
  SUBJECT: string;
  NAME?: string;
  ROOMS?: string[];
  //plus many others, some are strings, some numbers
}

@Injectable()
export class ClientService {
  public messages: Subject < Message > ;
  constructor(wsService: WebsocketService) {
    this.messages = < Subject < Message >> wsService
      .connect(CHAT_URL).pipe(
        map((response: MessageEvent): Message => {
          console.log(response);
          const data = JSON.parse(response.data);
          return data;
      }));
  }

这是我上面使用的 WebSocketService。

import { Injectable } from '@angular/core';
import { Observable, Subject, Observer } from 'rxjs';
@Injectable()
export class WebsocketService {
  constructor() {}

  private subject: Subject < MessageEvent > ;

  public connect(url): Subject < MessageEvent > {
    if (!this.subject) {
      this.subject = this.create(url);
      console.log('Successfully connected: ' + url);
    }
    return this.subject;
  }

  private create(url): Subject < MessageEvent > {
    const ws = new WebSocket(url);
    const observable = Observable.create(
      (obs: Observer < MessageEvent > ) => {
        ws.onmessage = obs.next.bind(obs);
        ws.onerror = obs.error.bind(obs);
        ws.onclose = obs.complete.bind(obs);
        return ws.close.bind(ws);
      });
    const observer = {
      next: (data: Object) => {
        if (ws.readyState === WebSocket.OPEN) {
          ws.send(JSON.stringify(data));
        }
      }
    };
    return Subject.create(observer, observable);
  }

}

【问题讨论】:

  • messages 如何在客户端服务中声明和使用?
  • 显示messages的代码
  • 请出示您的服务代码。
  • @GCSDC 我用 ClientService 更新了帖子。
  • @Austaras 您现在可以在 Injectable 部分下的 ClientService 中找到它

标签: angular rxjs subscribe


【解决方案1】:

给ClientService添加一个share()操作符看看是否有效

  this.messages = < Subject < Message >> wsService
      .connect(CHAT_URL).pipe(
        map((response: MessageEvent): Message => {
          console.log(response);
          const data = JSON.parse(response.data);
          return data;
      }),share());

【讨论】:

  • 就是这样。我从 'rxjs/operators' 导入 { share } 并将其添加到管道中,就像您的答案一样。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 2021-09-02
  • 2019-03-21
  • 2021-04-03
相关资源
最近更新 更多