/ / rxJS obserwowalne, nie osiągające subscribe - kątowe, rxjs, obserwowalne

rxJS obserwowalne, nie osiągające subscribe - kątowe, rxjs, obserwowalne

Jestem z Angular 2, a RxJS i I mam problemy z konfiguracją prostego systemu obserwowalnego.

O ile rozumiem, operator jest używany do efektów ubocznych, a ty umieszczasz kod, aby poradzić sobie z wynikami zwróconymi przez obserwowalne w funkcji susbcribe ().

Tak więc mój komponent poprosi usługę o inicjalizacjęsystem. Usługa wykonuje 2 połączenia HTTP z serwerem i łączy je w jednym strumieniu, aby komponent mógł zasubskrybować i upewnić się, że wszystko jest gotowe. Jednym z 2 wywołań http w usłudze jest pobieranie ustalonej liczby wyników z serwera, które następnie będą dostarczane do Komponentu na żądanie. Kiedy więc usługa widzi, że potrzebuje więcej danych, wykonuje kolejne połączenie z serwerem.

To nie zadziałało, ponieważ uważam, że muszę najpierw zrezygnować z subskrypcji oryginalnego połączenia http przed utworzeniem nowego (czy to prawda?).

Więc to jest to, co mam ... co nie działa, ponieważ nie dostaje się do subskrypcji w metodzie getQuestions.

W komponencie

ngOnInit() {
// show spinner

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

W usłudze

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

Teraz to działa. Dlaczego nie dociera się do metody subskrypcji?

Czy istnieje lepszy sposób na osiągnięcie tego? Dzięki

Odpowiedzi:

1 dla odpowiedzi № 1

Ok, zdaję sobie sprawę (także, dzięki @martin), że przed upływem czasu anulowałem subskrypcję.

Udało mi się zdobyć to, co chciałem, więc na wypadek, gdyby ktoś chciał z niego skorzystać.

Usługa jest teraz następująca:

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

Więc mam teraz 2 różne metody; Nie muszę się wypisać (chyba) i wygląda na to, że teraz działa dobrze.