Reputation: 27
I have a question about observable. For example, we have api, and send a reguest there:
this.http.get('https://swapi.co/api/people/').subscribe(peoplesData => {
let peoples = peoplesData.json();
let nextPage = peoples.next; // https://swapi.co/api/people/?page=2
this.peoples = peoples.results;
});
When I send first request, I will get url for next request (in this example, url contains in 'nextPage'). I need to create method, which will make all request, and after every requests will add all 'results' to 'this.peoples'. I think, .mergeMap and switchMap don't fit for it. Maybe are you have more expirience with Observable? Please help me with this method.
Update I solved this problem with .expand:
return this.http.get('https://swapi.co/api/people/')
.expand(peoplesData => {
let peoples = peoplesData.json();
if (peoples.next) {
return this.http.get(peoples.next);
} else {
return Observable.empty();
}
})
.map(peoples => peoples.json());
Upvotes: 0
Views: 841
Reputation: 10643
My solution using rxjs Rx flatMap :
import {Observable} from 'rxjs/Rx';
ngOnInit() {
const arrayIds = [2456, 12456, 456, 7899];
this.doUsersRequest(arrayIds);
}
doUsersRequest(queryArr, previousObservable = null) {
if (queryArr.length) {
const url = 'api/users/id/' + queryArr.shift();
let observable = null;
if (previousObservable) {
observable = previousObservable.flatMap(() => {
return this.http.get(url);
});
} else {
observable = this.http.get(url);
}
return this.doUsersRequest(queryArr, observable);
} else {
return previousObservable;
}
}
Upvotes: 1