/ / rxJS observable que no alcanza suscribirse - angular, rxjs, observable

rxJS observable que no alcanza suscribirse - angular, rxjs, observable

Estoy con Angular 2 y RxJS y estoy teniendo dificultades para configurar un sistema simple de observables.

Según tengo entendido, el operador do se usa para efectos secundarios, y usted coloca el código para tratar los resultados devueltos por el observable en la función susbcribe ().

Así que mi Componente pide al Servicio que inicialice elsistema. El Servicio hace 2 llamadas http al servidor y las combina en un solo flujo para que el componente se suscriba y se asegure de que todo esté listo. Una de las 2 llamadas http en el servicio está recuperando un número fijo de resultados del servidor, que luego serán atendidos al Componente a pedido. Entonces, cuando el Servicio ve que necesita más datos, realiza otra llamada al servidor.

Esto no funcionó porque creo que necesito cancelar la suscripción primero a la llamada http original antes de hacer una nueva (¿es cierto?).

Así que esto es lo que tengo ... que no funciona porque no se puede suscribir en el método getQuestions.

En el componente

ngOnInit() {
// show spinner

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

En el servicio

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

Entonces, esto está funcionando ahora. ¿Por qué no está llegando el método de suscripción?

¿Hay una mejor manera de lograr esto? Gracias

Respuestas

1 para la respuesta № 1

Ok, me doy cuenta (también, gracias @martin) que estaba cancelando mi suscripción antes de tiempo.

Me las arreglé para obtener lo que quería, así que en caso de que alguien quiera usarlo.

El servicio ahora es así:

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

Así que tengo 2 métodos diferentes ahora; No necesito cancelar mi suscripción (creo) y parece que ahora funciona bien.