订阅者功能从未调用过

时间:2017-05-02 08:06:30

标签: angular rxjs angular-meteor

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

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

我不清楚什么是错的,并且会欣赏另一组经验丰富的眼睛。

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();
    }

}

1 个答案:

答案 0 :(得分: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之前的值)