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 № 1Ok, 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.