我如何才能延迟可观察对象的返回速度

时间:2019-01-03 22:33:01

标签: rxjs rxjs6 rxjs-pipeable-operators

例如:

 this.http.get('/getdata').pipe(delay(2000))

我希望此请求至少需要2秒的时间才能完成,但不能超过请求完成的时间。

换句话说:

  1. 如果请求需要 1s 完成,我希望观察对象在 2s 中完成。

  2. 如果请求需要 3s 完成,我希望观察对象在 3s 而不是 5s 中完成。

除了delay()之外,还有其他一些管道可以实现我不知道的管道吗?或者有必要的话,可以为此构建自定义管道吗?

用例是显示一个加载器,但是如果请求完成得太快,那么当加载器只是“闪烁”一秒钟时,效果就不好了

2 个答案:

答案 0 :(得分:1)

要回答所问的问题,您可以简单地使用combineLatest()组合一个timer(2000)可观察值和请求可观察值,然后忽略计时器可观察值。之所以起作用,是因为combineLatest一直等到所有可观察对象都发出了至少一个值,然后才发出一个值。

combineLatest(this.http.get('/getdata'), timer(2000), x => x)

答案 1 :(得分:0)

感谢GregL,我将其更新为仅使用forkJoin。这将获取流的最新值。但是,如果您希望在每次发射时都进行检查,则可以用CombineLatest替换forkJoin,这也将起作用。 在我的工作示例中:

    this.ibanSubscription = forkJoin({
        iban: this.ibantobicService.getById(Iban),
        timer: timer(1000) //so now the ajax call will take at least 1 second 
        }
    ).pipe(
        map( (stream: any) => <BicModel>stream.iban),
        switchMap( (bic: BicModel) => of(this.processIbanData(bic))),
        catchError((error: any) => of(this.messageList.handleError(error))),
        finalize(() => this.loadIbanToBicFinalize())
   ).subscribe();