根据Angular2

时间:2017-05-05 14:47:55

标签: angular rxjs

我必须为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);
        });

    }

非常感谢任何建议。

2 个答案:

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

    }