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?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage