rxJS observable未达到订阅

时间:2017-01-27 10:19:43

标签: angular rxjs observable

我使用的是Angular 2和RxJS,我很难设置一个简单的observables系统。

据我了解,运算符do用于副作用,并且您可以放置​​代码来处理susbcribe()函数中observable返回的结果。

所以我的组件要求服务初始化系统。 该服务对服务器进行2次http调用,并将它们组合在一个流中,以便组件进行订阅并确保一切准备就绪。 服务中的2个http调用之一是从服务器检索固定数量的结果,然后根据需要将其提供给组件。因此,当服务发现它需要更多数据时,它会再次调用服务器。

这不起作用,因为我认为我需要先取消订阅原始的http调用才能创建一个新的(这是真的吗?)。

所以这就是我所拥有的...这是行不通的,因为它没有在getQuestions方法中订阅。

在组件

ngOnInit() {
    // show spinner

    this.gamesService
      .initializeGame()
      .subscribe(data => {
        console.log('Game initialized');
        // remove spinner
      });
  }

在服务中

initializeGame(opponent_id: string): Observable<any> {
    return Observable
      .forkJoin([this.getQuestions(), this.newGame()]);
  }

  getQuestions(): Observable<any> {
    // composes postData with POST parameters

    this.questionsObservable = this.authHttp
      .post(this.settings.authApiUrl, postData)
      .map((response: Response) => response.json());

    this.questionsObservable
      .subscribe(data => {
        // save data in the service, which will be consumed
      })
      .unsubscribe(); // do I need to unsubscribe?

    return this.questionsObservable;
  }

  getQuestion(category: string): any {
    // consume question by Component
    if (no_more_questions_in_service) this.getQuestions();
    return question;
  }

所以,这现在正在发挥作用。 为什么没有达到订阅方法?

有没有更好的方法来实现这一目标? 感谢

1 个答案:

答案 0 :(得分:1)

好的,我知道(也是,感谢@martin)我之前没有订阅。

我设法得到我想要的东西,以防有人想要使用它。

服务现在是这样的:

initializeGame(opponent_id: string): Observable<any> {
    return Observable
      .forkJoin([this.getQuestions(), this.newGame()]);
  }

  getQuestions(): Observable<any> {
    // postData

    return this.authHttp
      .post(this.settings.authApiUrl, postData)
      .map((response: Response) => response.json())
      .do(data => save_data);
  }

  private getQuestionsByCategory(category: string) {
    // postData

    this.authHttp
      .post(this.settings.authApiUrl, postData)
      .map((response: Response) => response.json())
      .subscribe(data => save_data
  }

  getQuestion(category: string): any {
    // consume question by Component
    if (no_more_questions_in_service)
      this.getQuestionsByCategory(category);
    }
    return question;
  }

所以我现在有两种不同的方法;我不需要取消订阅(我认为),现在似乎工作正常。