flatMap中的请求之间的延迟

时间:2017-06-30 06:18:30

标签: angular rxjs

我有几个必须逐个调用的请求:

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字段为真时我才需要延迟。我该怎么办?

2 个答案:

答案 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});
      }
    });
  }
}

结果: enter image description here

答案 1 :(得分:3)

方法1:

如果您只想在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);
        })
}

方法2:

如果你想在方法之外做,那么你可以这样做:

this.firstRequest()
    .flatMap(resp => {
        //check response
        if(!response.success) {
            return Observable.throw('some message');
        }
        return Observable
            .delay(500)
            .flatMap(()=>this.secondRequest())
    })
    .subscribe(...)

这两种方法都没问题,但你不能同时使用这两种方法。