我使用的是角度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来发出下一个请求,但没有成功。
答案 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
方法中指定的回调的两种情况下的数据。