Turning paginated requests into an Observable stream with RxJs

后端 未结 4 833
渐次进展
渐次进展 2020-12-30 10:28

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

4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-30 10:37

    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);
      }
    )
    

提交回复
热议问题