这很大程度上取决于您想要实现的目标。
如果你想基于之前的某个 Observable 递归调用一个 Observable 并且你不知道要调用它多少次,那么使用expand() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-expand操作员。
例如,此演示根据先前调用的响应递归创建 5 个请求(count
财产):
import { Observable } from 'rxjs/Observable';
function mockPostRequest(count) {
return Observable.of(`{"count":${count},"data":"response"}`)
.map(val => JSON.parse(val));
}
Observable.of({count: 0})
.expand(response => {
console.log('Response:', response.count);
return response.count < 5 ? mockPostRequest(response.count + 1) : Observable.empty();
})
.subscribe(undefined, undefined, val => console.log('Completed'));
打印到控制台:
Response: 0
Response: 1
Response: 2
Response: 3
Response: 4
Response: 5
Completed
观看现场演示:http://plnkr.co/edit/lKNdR8oeOuB2mrnR3ahQ?p=preview http://plnkr.co/edit/lKNdR8oeOuB2mrnR3ahQ?p=preview
或者如果你只是想依次调用一堆 HTTP 请求(concatMap() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concatMap操作员)或立即调用所有这些并在它们到达时使用它们(mergeMap() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap操作员):
Observable.from([
'https://httpbin.org/get?1',
'https://httpbin.org/get?2',
'https://httpbin.org/get?3',
])
.concatMap(url => Observable.of(url))
.subscribe(response => console.log(response));
打印到控制台:
https://httpbin.org/get?1
https://httpbin.org/get?2
https://httpbin.org/get?3
观看现场演示:http://plnkr.co/edit/JwZ3rtkiSNB1cwX5gCA5?p=preview http://plnkr.co/edit/JwZ3rtkiSNB1cwX5gCA5?p=preview