I have a service which returns data in pages. The response to one page contains details on how to query for the next page.
My approach is to return the response data
EDIT Ah! I see the problem you're facing. A bit of tail call optimization should fix you up:
function mockGetPageAjaxCall(index) {
// return dummy data for testcase
return Promise.resolve({nextpage:index+1, data:[1,2,3]});
}
function getPageFromServer(index) {
return Observable.create(function(obs) {
mockGetPageAjaxCall(index).then(function(page) {
obs.onNext(page);
}).catch(function(err) {
obs.onError(err)
}).finally(function() {
obs.onCompleted();
});
});
}
function getPagedItems(index) {
return Observable.create(function(obs) {
// create a delegate to do the work
var disposable = new SerialDisposable();
var recur = function(index) {
disposable.setDisposable(getPageFromServer(index).retry().subscribe(function(page) {
obs.onNext(page.items);
if(page.nextpage === null) {
obs.onCompleted();
}
// call the delegate recursively
recur(page.nextpage);
}));
};
// call the delegate to start it
recur(0);
return disposable;
});
}
getPagedItems(0).subscribe(
function(item) {
console.log(new Date(), item);
},
function(error) {
console.log(error);
}
)