进行第二次http调用,并将结果用于同一个Observable

时间:2016-07-11 13:58:44

标签: javascript angular rxjs

我使用的是角度2,它是http组件。

我想调用一个REST API来返回一个Elements列表。该列表的大小限制为100个条目。如果有更多项目,则会在响应中设置hasMore标记。然后,您必须使用参数page = 2再次调用API。有一个Observable,两个服务器响应都会很好。 我的代码看起来像这样:

call({page: 1})
  .map(res => res.json())
  .do((res) => {
    if(res.meta.hasMore){
      // do another request with page = 2
    }
  }
  .map(...)
  .subscribe(callback)

call是一个函数,它将使用http模块发出请求并返回一个Observable。在if语句中,我想创建另一个http请求并将结果放在同一个Observable上,以便使用subscribe注册的回调将被调用两次(每次响应一次)。

我不确定该怎么做。我尝试使用flatMap来发出下一个请求,但没有成功。

2 个答案:

答案 0 :(得分:6)

递归正是扩展运算符的用途:

let callAndMap = (pageNo) => call({page: pageNo}).map(res => {page: pageNo, data: res.json()});  // map, and save the page number for recursion later.

callAndMap(1)
.expand(obj => (obj.data.meta.hasMore ? callAndMap(obj.page + 1) : Observable.empty()))
//.map(obj => obj.data)    // uncomment this line if you need to map back to original response json
.subscribe(callback);

答案 1 :(得分:2)

您可以利用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form method="post" action=""> <div class="form-row"> <label> <span>Register</span> <select name="register_as" id="dropdown"> <option value="none">Select One</option> <option value="user">User</option> <option value="designer">Designer</option> </select> </label> </div> <div> <label><span>Gender</span></label> <div class="form-radio-buttons"> <div> <label> <input type="radio" name="gender" value="male"> <span>Male</span> </label> </div> <div> <label> <input type="radio" name="gender" value="female"> <span>Female</span> </label> </div> </div> </div> <div> <input type="submit"> </div> </form> 运算符:

flatMap

最后一个call({page: 1}) .map(res => res.json()) .flatMap((res) => { if(res.meta.hasMore){ return Observable.forkJoin([ Observable.of(res), call({page: 2}).map(res => res.json() ]); } else { return Observable.of(res); } }) .map(data => { // if data is an array, it contains both responses of request // data[0] -> data for first page // data[1] -> data for second page // if data is an object, it contains the result of the first page }) .subscribe(callback); 运算符用于格式化map方法中指定的回调的两种情况下的数据。