仅当可观察量返回速度快于延迟时,我如何才能延迟该可观察量



举个例子:

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

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

换句话说:

  1. 如果请求需要 1 秒才能完成,我希望可观察量在 2 秒内完成。

  2. 如果请求需要 3 秒才能完成,我希望可观察量在 3 秒而不是 5 秒内完成。

除了delay()之外,还有其他管道可以实现我不知道的,或者如有必要,是否有办法为此构建自定义管道?

用例是显示加载器,但是如果请求完成得太快,当加载器只是"闪烁"一瞬间时,它看起来并不好

要回答所问的问题,您可以简单地使用 combineLatest() 将可观察timer(2000)和可观察的请求结合起来,然后忽略计时器可观察的结果。它之所以有效combineLatest会等到所有可观察量都发出至少一个值后再发出一个值。

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

感谢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();

最新更新