根据Angular2中以前的响应进行多个http调用
我必须为我的angular2应用程序进行多个http调用。我首先要打一个电话,等待响应,从中检索下一个电话的url,然后再打下一个电话。同样,我的第三个电话是基于第二个电话的回复。我必须执行此操作,直到http调用的响应没有指向下一个调用的url为止。这里的问题是我无法知道我要打多少个电话(这完全取决于当前的响应,如果它有到下一个电话的链接)。我还需要整合所有电话的回复 下面是每个呼叫的响应根据Angular2中以前的响应进行多个http调用,angular,rxjs,Angular,Rxjs,我必须为我的angular2应用程序进行多个http调用。我首先要打一个电话,等待响应,从中检索下一个电话的url,然后再打下一个电话。同样,我的第三个电话是基于第二个电话的回复。我必须执行此操作,直到http调用的响应没有指向下一个调用的url为止。这里的问题是我无法知道我要打多少个电话(这完全取决于当前的响应,如果它有到下一个电话的链接)。我还需要整合所有电话的回复 下面是每个呼叫的响应 { "data": { "page": 5, "pageSize": 500,
{
"data": {
"page": 5,
"pageSize": 500,
"totalSize": 3000,
"entries": [],
"nextPage": {
"href": "http://someurl?
requestParam=someValue&page=1&pageSize=500",
"rel": null
}
}
}
我必须从nextPage属性中提取值并进行http调用,直到得到响应,其中nextPage属性为null,如下所示
{
"data": {
"page": 5,
"pageSize": 500,
"totalSize": 3000,
"entries": [],
"nextPage": null
}
}
这是我用来打一个电话的代码。我不知道该怎么做
连锁这些电话
private load(extraUrlParam?: any) {
let me = this;
let url = me.getUrl(type, extraUrlParam, null);
me.pHttp.get(url, this.getHttpOptions())
.map((response: Response) => response.json())
.subscribe(
data => {
console.log("data received");
me.data = this.preProcessData(data);
me.dataSubject.next(this.data);
},
error => {
this.dataSubject.error(error);
me.handleError(error, url, type);
});
}
非常感谢您的建议。我不知道这是否是最好的解决方案。但我想到的是类似@mast3rd3mon建议的递归: 调用loadData()一次
使用递归。这里有一个例子。它将执行序列并累积结果,直到满足条件为止
function getNext(acc, res) {
return res < 10 ?
Rx.Observable.of({acc: acc + ':' + (res+1), val: res+1})
.switchMap(({acc, val}) => getNext(acc, val)) :
Rx.Observable.of({acc:acc, val: 'done'});
}
Rx.Observable.of(0)
.switchMap(x => getNext(x, x))
.subscribe(({acc}) => console.log('result:', acc))
函数getNext(acc、res){
返回res<10?
({acc:acc+':'+(res+1),val:res+1})的Rx.Observable.of({acc:acc+':'+(res+1),val:res+1})
.switchMap(({acc,val})=>getNext(acc,val)):
Rx.Observable.of({acc:acc,val:'done'});
}
(0)的可观测接收值
.switchMap(x=>getNext(x,x))
.subscribe(({acc})=>console.log('result:',acc))
在第二、第三等位置。。。将url设置为下一页href?你可以使用递归,但你甚至不需要,并且可以并行进行所有调用(第一个除外):因为你有总大小(3000)和页面大小(500),你知道应该有6个页面。谢谢你的评论。我尝试了@mast3rd3mon建议的递归,它成功了。
function getNext(acc, res) {
return res < 10 ?
Rx.Observable.of({acc: acc + ':' + (res+1), val: res+1})
.switchMap(({acc, val}) => getNext(acc, val)) :
Rx.Observable.of({acc:acc, val: 'done'});
}
Rx.Observable.of(0)
.switchMap(x => getNext(x, x))
.subscribe(({acc}) => console.log('result:', acc))