我必须为angular2应用程序进行多次http调用。我首先要拨打一个电话,等待响应,从中检索下一个电话的网址并进行后续通话。同样,我的第三个电话是基于第二个电话的回复。我必须执行此操作,直到http调用的响应没有到下一个调用的url。这里的问题是我无法知道我将要拨打多少电话(它完全取决于当前的响应,如果它有下一个呼叫的链接)。此外,我需要整合所有电话的响应。
以下是每次通话的回复。
{
"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);
});
}
非常感谢任何建议。
答案 0 :(得分:1)
使用递归。这是一个例子。它将执行序列并累积结果,直到满足条件。
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))
答案 1 :(得分:0)
我不知道这是否是最佳解决方案。但是我想到的是像@ mast3rd3mon建议的递归:
调用loadData()一次
private url:string;
private loadData(extraUrlParam?: any){
let me = this;
this.url = me.getUrl(type, extraUrlParam, null);
this.load(extraUrlParam);
}
private load(extraUrlParam?: any) {
let me = this;
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);
// CHANGE THE URL HERE
me.url = RECIEVED_URL;
me.load(extraUrlParam);
},
error => {
this.dataSubject.error(error);
me.handleError(error, url, type);
});
}