Json 可从RESTful分页集合中观察到
一方面,我有一个宁静的HAL HATEOAS系列,看起来像这样: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"
{
"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);
});
}