Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Angular2中以前的响应进行多个http调用_Angular_Rxjs - Fatal编程技术网

根据Angular2中以前的响应进行多个http调用

根据Angular2中以前的响应进行多个http调用,angular,rxjs,Angular,Rxjs,我必须为我的angular2应用程序进行多个http调用。我首先要打一个电话,等待响应,从中检索下一个电话的url,然后再打下一个电话。同样,我的第三个电话是基于第二个电话的回复。我必须执行此操作,直到http调用的响应没有指向下一个调用的url为止。这里的问题是我无法知道我要打多少个电话(这完全取决于当前的响应,如果它有到下一个电话的链接)。我还需要整合所有电话的回复 下面是每个呼叫的响应 { "data": { "page": 5, "pageSize": 500,

我必须为我的angular2应用程序进行多个http调用。我首先要打一个电话,等待响应,从中检索下一个电话的url,然后再打下一个电话。同样,我的第三个电话是基于第二个电话的回复。我必须执行此操作,直到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);
        });

    }

非常感谢您的建议。

我不知道这是否是最好的解决方案。但我想到的是类似@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))