Transformando Pedidos Paginados em um Fluxo Observável com RxJs
Eu tenho um serviço que retorna dados em páginas. A resposta a uma página contém detalhes sobre como consultar a próxima página.
Minha abordagem é retornar os dados de resposta e concatenar imediatamente uma chamada adiada para a mesma sequência observável, se houver mais páginas disponíveis.
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);
}
)
Essa deve ser a abordagem errada, pois em 2 segundos você obtém:
throw e;
^
RangeError: Maximum call stack size exceeded
at CompositeDisposablePrototype.dispose (/Users/me/node_modules/rx/dist/rx.all.js:654:51)
Qual é a abordagem correta para paginação?