Paginierte Anfragen mit RxJs @ in einen Observable-Stream umwande
Ich habe einen Dienst, der Daten in Seiten zurückgibt. Die Antwort auf eine Seite enthält Details zur Abfrage der nächsten Seite.
Mein Ansatz besteht darin, die Antwortdaten zurückzugeben und einen zurückgestellten Anruf sofort auf dieselbe beobachtbare Sequenz zu beschränken, wenn mehr Seiten verfügbar sind.
function getPageFromServer(index) {
// return dummy data for testcase
return {nextpage:index+1, data:[1,2,3]};
}
function getPagedItems(index) {
return Observable.return(getPageFromServer(index))
.flatMap(function(response) {
if (response.nextpage !== null) {
return Observable.fromArray(response.data)
.concat(Observable.defer(function() {return getPagedItems(response.nextpage);}));
}
return Observable.fromArray(response.data);
});
}
getPagedItems(0).subscribe(
function(item) {
console.log(new Date(), item);
},
function(error) {
console.log(error);
}
)
Dies muss der falsche Ansatz sein, denn innerhalb von 2 Sekunden erhalten Sie:
throw e;
^
RangeError: Maximum call stack size exceeded
at CompositeDisposablePrototype.dispose (/Users/me/node_modules/rx/dist/rx.all.js:654:51)
Was ist der richtige Ansatz zur Paginierung?