【问题标题】:Subscribe Observable, Can not get the value订阅 Observable,取不到值
【发布时间】:2017-11-23 11:50:50
【问题描述】:

订阅 Observable,取不到值。

当前行为

  • 我运行一个 nodejs 服务器,命名为 N 。它提供数据。然后,我运行一个名为 A 的 Angular 应用程序。
  • A和N建立socket连接。一个行为客户。 N 行为服务器。
  • N有一个定时任务向客户端A发送数据
  • 在A中,我使用了一个服务来接收数据。可以得到。
  • 服务注入一个组件,但无法获取组件中的订阅数据。

预期行为

  • 可以在组件中获取订阅数据。

用指令最小化重现问题

  • 角度服务:

    createObservableSocket(url: string, id: number): Observable<any> {   
      let a = new Observable<string>(
      observer => {
        this.ws.onmessage = (event) => {
          observer.next(event.data);
          console.log('event data:', event.data); // event data: [{"productId":1,"bid":3616.8217831199527}]
        }
        this.ws.onerror = (event) => observer.error(event);
        this.ws.onopen = (event) => this.sendMessage({productId: id});
        this.ws.onclose = (event) => observer.complete();
      }
    );
    console.log('a:', a); // [Observable object]
    let b = a.map(message => {
      JSON.parse(message);
    });
    console.log('b:', b); // [Observable object]
    return b;
    

    }

    sendMessage(message: any) {
      console.log('client ws service msg:', JSON.stringify(message)); //client ws service msg: {"productId":1}
      this.ws.send(JSON.stringify(message)); 
    }
    
  • 角度分量

    watchProduct() {
      this.isWatched = !this.isWatched;
    
      this.wsService.createObservableSocket('ws://localhost:8085', 
      this.product.id)
        .subscribe(
          products => {
            console.log('component received:', products); //component  received: undefined
            let product = products.find( p => p.productId === this.product.id);
            this.currentBid = product.bid;
          }
        );
      }
    

环境


Angular version: 4.2.4

Browser:
- [ ] Chrome (desktop) version 60.0.3112.101

For Tooling issues:
- Node version: v8.1.0
- Platform: Windows 10

其他:

  • 为什么不能订阅数据,请帮帮我。谢谢!

【问题讨论】:

  • 我相信这与重新分配初始 Observable 有关。请您尝试在没有.map() 的情况下返回a,然后看看您是否会在组件中获取数据。

标签: angular


【解决方案1】:

你需要return数据:

所以改变这个:

a.map(message => {
  JSON.parse(message);
});

收件人:

a.map(message => {
  return JSON.parse(message);
});

// OR

a.map(message => JSON.parse(message));

【讨论】:

  • @ziyangding,请用给定的代码块替换代码块并尝试,你没有从a.map返回任何东西。
  • createObservableSocket(url: string, id: number): Observable { this.ws = new WebSocket(url); return new Observable(observer => { this.ws.onmessage = (event) => { observer.next(event.data); console.log('event data:', event.data); } this. ws.onerror = (event) => observer.error(event); this.ws.onclose = (event) => observer.complete(); this.ws.onopen = (event) => this.sendMessage({productId : id}); } ).map(message => {JSON.parse(message)}); }
  • @ziyangding 然后只需将JSON.parse(message) 更改为return JSON.parse(message) 或删除JSON.parse(message) 前后的大括号
  • 我删除了大括号,成功了!非常感谢!
  • @ziyangding,你能接受答案并投票吗?
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2019-12-29
  • 2020-08-29
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多