我使用的是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;
}
所以,这现在正在发挥作用。 为什么没有达到订阅方法?
有没有更好的方法来实现这一目标? 感谢
答案 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;
}
所以我现在有两种不同的方法;我不需要取消订阅(我认为),现在似乎工作正常。