我有几个必须逐个调用的请求:
this.firstRequest()
.flatMap(resp => {
//check response
if(!response.success) {
return Observable.throw('some message');
}
return this.secondRequest();
})
.subscribe(...)
firstRequest() {
// build params and call http service
return this.service.getData(...)
.do(r => {
if(r.success) {
this.localStorage.save('code', r.code)
}
})
.delay(5000);
}
正如您所看到的,第一次和第二次请求之间存在延迟。但是,只有当success
字段为真时我才需要延迟。我该怎么办?
答案 0 :(得分:4)
以下是一些应该有用的代码:
ngAfterViewInit() {
this.request1()
.flatMap((response:any)=>{
console.log(response);
if(!response.success){
return this.request2().delay(10000);
}
return this.request2();
})
.subscribe((response:any)=>{
console.log(response.value);
});
}
request1():Observable<any>{
return Observable.create(observer=>{
for(let i=0; i<2; i++){
let success =i%2==0? true:false;
observer.next({value:"request1:"+i,success:success});
}
});
}
request2():Observable<any>{
return Observable.create(observer=>{
for(let i=0; i<2; i++){
observer.next({value:"request2:"+i});
}
});
}
}
答案 1 :(得分:3)
如果您只想在firstRequest()
方法中执行此操作,那么您可以通过.of()
内的.flatMap()
返回不同的可观察对象:
firstRequest() {
// build params and call http service
return this.service.getData(...)
.flatMap(r=>{
if(r.success) {
this.localStorage.save('code', r.code);
//delay for 500ms, then return the same response back
return Observable
.delay(500)
.of(r);
}
//not successful, dont delay. return the original Observable
return Observable.of(r);
})
}
如果你想在方法之外做,那么你可以这样做:
this.firstRequest()
.flatMap(resp => {
//check response
if(!response.success) {
return Observable.throw('some message');
}
return Observable
.delay(500)
.flatMap(()=>this.secondRequest())
})
.subscribe(...)
这两种方法都没问题,但你不能同时使用这两种方法。