【问题标题】:Subscriber function never called订阅者函数从未被调用
【发布时间】:2017-05-02 08:06:30
【问题描述】:

我正在尝试向服务器查询字符串令牌,然后客户端组件将使用该字符串令牌。客户端上的流星方法调用需要一个异步结果,并返回一个 Observable。一旦方法完成,它会调用 Observable 上的 next。组件订阅 Observable。

但是,当代码运行时,就会出现问题。在调试器中,Observable 没有任何订阅者。因此调用 next() 时不会调用订阅者回调。

我不清楚出了什么问题,希望能有另一双经验丰富的眼睛。

import { Component, OnInit, OnDestroy, Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { Subscription } from 'rxjs/Subscription';
import { Observable } from 'rxjs/Observable';

@Component({
  selector: "test",
  template: ``
})
export class TestComponent implements OnInit, OnDestroy {

  myToken: Observable<string>;
  private tokenSubscription: Subscription;

  constructor(private theService: SomeService) {}

  ngOnInit() {
    this.myToken = this.theService.createToken(); 
    this.tokenSubscription = this.myToken.subscribe((token: string) => {
        this.doSomething(token);
    });
  }

  ngOnDestroy() {
    this.tokenSubscription.unsubscribe();
  }

  doSomething(token: string) {
//    ...
  }
}

@Injectable()
export class SomeService {

  createToken(): Observable<string> {
      let subject: Subject<string> = Subject.create();
      Meteor.call("serverOnly.createToken", (err, result: {"data": string}) => {
          if (err) {
              throw new Meteor.Error("createToken", err);
          } else {
              subject.next(result.data);
          }
      });

      return subject.asObservable();
    }

}

【问题讨论】:

    标签: angular rxjs angular-meteor


    【解决方案1】:

    尝试像这样捕获订阅中的错误

    this.tokenSubscription = this.myToken.subscribe((token: string) => {
        this.doSomething(token);
    }, (err) => {
        console.log(err);
    });
    

    --更新--

    使用ReplaySubject 而不是Subject。因为Subject 只能将数据推送给过去的订阅者,也就是说,在您的情况下,subject.next() 在订阅之前被调用,这不会将值推送到流中,因为目前没有订阅者。

    let subject: ReplaySubject<string> = new ReplaySubject<string>(1); 
    

    这里的 1 是缓冲区值,表示通过调用 .next 发出多少先前的值应该发送给未来的订阅者(在这种情况下,它是 1 个先前的值)

    【讨论】:

    • 感谢您的建议,但永远不会调用 err(和完成)回调,因为由于某种原因订阅没有订阅者
    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多