Mit Ihrer Implementierung getData()
Anwendungen, was auch immer Wert this.url
zum Zeitpunkt hält getData() wird aufgerufen. Mit anderen Worten, wenn Sie this.url
ändern, nachdem Sie getData()
aufgerufen haben, wird nichts passieren.
zu tun, was Sie beschreiben, müssen Sie den Strom von verschiedenen URLs innerhalb einer beobachtbaren einzuwickeln:
import {Subject} from 'rxjs/Subject';
@Injectable()
export class HttpService {
// The `url` property is replaced with an observable emitting a stream of URLs.
private _urlsStream: Subject<string> = new Subject<string>();
constructor(private http: Http) {}
// The http.get() now gets its urls from the url stream.
// Every time a new url is pushed to the stream, a new request is executed.
getData() {
return this._urlsStream.asObservable()
.mergeMap((url: string) => this.http.get(url))
.map((res: Response) => res.json());
}
setUrl(url) {
// Setting an url pushes the given url to the stream.
this._urlsStream.next(url);
}
}
Dieser Code als die ursprüngliche Version auf jeden Fall mehr beteiligt ist. Ich habe Kommentare hinzugefügt, um zu klären, aber wenn Sie neu bei RxJS sind, schlage ich vor, dass Sie einige Zeit mit reading the manual und watching some tutorials verbringen.
Sie werden darüber erfahren möchten:
- die verschiedenen Arten von Observablen (I verwendet, um eine
Subject
, die eine besondere Art der zu beobachten ist, dass beide Werte emittieren können und abonniert werden).
- Die verschiedenen Arten von Operatoren (ich verwendete
mergeMap()
zu "projizieren" eine beobachtbare - der Strom von URLs - in eine andere beobachtbare - die HTTP-Anfragen).