Json 可从RESTful分页集合中观察到

Json 可从RESTful分页集合中观察到,json,rest,angular,rxjs,hateoas,Json,Rest,Angular,Rxjs,Hateoas,一方面,我有一个宁静的HAL HATEOAS系列,看起来像这样: { "page": 1, "limit": 10, "pages": 18, "total": 174, "_links": { "self": { "href": "/users?page=1&limit=10" }, "first": { "href": "/users?page=1&limit=10" }, "last"

一方面,我有一个宁静的HAL HATEOAS系列,看起来像这样:

{
    "page": 1,
    "limit": 10,
    "pages": 18,
    "total": 174,
    "_links": {
        "self":  { "href": "/users?page=1&limit=10" },
        "first": { "href": "/users?page=1&limit=10" },
        "last":  { "href": "/users?page=18&limit=10" },
        "next":  { "href": "/users?page=2&limit=10" }
    },
    "_embedded": {
        "users": [
            {
                "name": "bob",
                "_links": { "self": { "href": "/users/1" } }
            },
            ...
        ]
     }
}
另一方面,我有一个Angular 2应用程序

public getUsers(uri: string = this.baseURI): Observable<User> {
  return this.http.get(uri)
    .map(res => res.json()._embedded.users as User[])
    .flatMap(d => d) // Transform the flux of arrays in flux of users
    .catch(this.handleError);
} // Get only the 10th first users
递归函数

loadAll(uri: string) {
    read(uri)
      .subscribe(
        user => {
          this.stockedUsers.push(user);
        },
        error => console.log(error),
        () => {
          if (this.nextUri) {
            this.loadAll(this.nextUri);
          }
        }
      );
}
有人知道如何正确实现这一点吗?
我想保持RxJS通量的优势

更新/回答 我真傻!我想我自己回答了。也许这会帮助其他人:

public read(uri: string = this.baseURI): Observable<User> {
  return Observable.create(observer => this.iteratePages(observer, uri));
}

private iteratePages(observer: Observer<User>, uri): void {
  if (uri == null) { return observer.complete(); }
  this.http.get(uri).subscribe(res => {
    const data = res.json();
    for (const user of data._embedded.users) {
      observer.next(user as User);
    }
    const nextUri = (data._links && data._links.next) ? data._links.next.href : null;
    this.iteratePages(observer, nextUri);
  });
}
公共读取(uri:string=this.baseURI):可观察{
返回Observable.create(observer=>this.iteratePages(observer,uri));
}
私有iteratePages(观察者:观察者,uri):void{
如果(uri==null){return observer.complete();}
this.http.get(uri).subscribe(res=>{
const data=res.json();
for(数据的const user.\u embedded.users){
下一步(用户作为用户);
}
const nextUri=(data.\u links&&data.\u links.next)?data.\u links.next.href:null;
这是iteratePages(observer,nextUri);
});
}

您的意思是要获取所有用户,直到您在一次拍摄中到达终点?或者你正在考虑一个无限卷轴?更像是一个带有“未完成”事件的无限卷轴。但我想我找到了一种方法,通过创造一个新的可观察的。我会做一些测试,更新我的问题。
public read(uri: string = this.baseURI): Observable<User> {
  return Observable.create(observer => this.iteratePages(observer, uri));
}

private iteratePages(observer: Observer<User>, uri): void {
  if (uri == null) { return observer.complete(); }
  this.http.get(uri).subscribe(res => {
    const data = res.json();
    for (const user of data._embedded.users) {
      observer.next(user as User);
    }
    const nextUri = (data._links && data._links.next) ? data._links.next.href : null;
    this.iteratePages(observer, nextUri);
  });
}