Ich habe eine Angular Http get Anfrage, die die Route zu einer der drei Routen abhängig von den zurückgegebenen Daten navigieren wird. Beispielcode unten:Angular2 Routing und Cancelling Observables Mid Stream
SomeComponent:
constructor(
private someService: SomeService,
private router: Router
) { }
ngOnInit() {
this.someService.getSomeData().subscribe(
() => {
console.log("getSomeData() did not route to a new link! Routing to a 3rd link");
this.router.navigate(['home']);
},
() => {
console.log("Some error occurred.");
});
Someservice:
constructor(
private router: Router,
private someOtherService: SomeOtherService
) { }
getSomeData() {
return this.someOtherService.getSomeOtherData().map(data => {
if (data === 'someValue') {
console.log("The data was 'someValue'");
this.router.navigate(['route1']);
}
else if (data == 'someOtherValue') {
console.log("The data was 'someOtherValue'");
this.router.navigate(['route2']);
}
});
}
SomeOtherService:
constructor(
private http: Http
) { }
getSomeOtherData() {
return this.http.get(this.getDataUrl) {
.map((res: Response) => {
console.log("Sending over the data back to SomeService");
let body = res.json();
return body.data;
})
.catch((err: Response) => {
console.log(err);
return Observable.throw(err);
});
}
}
Das erwartete Verhalten ist, dass die Daten von SomeOtherService nach dem Empfang, der Router Navigieren Sie entweder zu route1
oder route2
abhängig von den Daten (die ich dachte irgendwo gelesen zu haben würde den Observable Stream stoppen? Vielleicht habe ich falsch gelesen). Wenn die Daten nicht übereinstimmen, fährt der Observable-Stream mit SomeComponent fort, der dann zu home
navigiert.
Das tatsächliche Verhalten ist, dass der Router zunächst zu route1
oder route2
routet, aber da der Strom fortgesetzt wird, routet der Router schließlich zu home
.
Also meine Frage ist, wenn Sie eine Rxjs Observable abonnieren, gibt es eine Möglichkeit, den Observable Mid-Stream abzubrechen/abmelden? Ich dachte, dass das Navigieren zu einer anderen Route das Observable abbrechen würde, aber das schien für mich nicht zu funktionieren.
Ich habe versucht, innerhalb der map
Methode mit interessanten (ly bad) Ergebnisse abzubestellen. Ich habe auch versucht, andere Observable-Methoden zu betrachten, aber da ich neu bei rxjs bin, war ich mir nicht sicher, welche Methode am besten geeignet wäre (ich bin wirklich nur mit , , und (sort of) switchMap
an dieser Stelle vertraut).
Wenn Ihre einzige Observable durch das 'this.http.get' erzeugt wird, wird diese Observable automatisch beendet, wenn die Antwort zurückgegeben wird. Keine Notwendigkeit, es abzubrechen. – DeborahK