Как я могу задержать наблюдаемое, только если оно возвращается быстрее, чем задержка

Взять, к примеру:

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

Я хотел бы, чтобы этот запрос занимал как минимум 2 секунды, но не дольше, чем требуется для выполнения запроса.

Другими словами:

  1. если запрос занимает 1 с, я хочу, чтобы наблюдаемое завершилось за 2 с.

  2. если запрос занимает 3 секунды, я хочу, чтобы наблюдаемое завершилось за 3 секунды, а не 5 секунд.

Есть ли какая-то другая труба, кроме delay() что может достичь этого, о чем я не знаю, или есть ли способ построить специальный канал для этого, если это необходимо?

Вариант использования - показать загрузчик, однако, если запрос завершается слишком быстро, он не выглядит хорошо, когда загрузчик просто "мигает" в течение доли секунды.

1 ответ

Решение

Чтобы ответить на заданный вопрос, вы можете просто использовать combineLatest() объединить timer(2000) наблюдаемый и наблюдаемый запрос, тогда просто игнорируйте результат от наблюдаемого таймера. Это работает потому что combineLatest ждет, пока все наблюдаемые не испустят хотя бы одно значение, прежде чем испускать его само.

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

Благодаря GregL я обновил это, чтобы просто использовать forkJoin. Это получит последнее значение потоков. Но если вы хотите проверять его при каждой эмиссии, вы можете заменить forkJoin на combLatest, и это тоже сработает. В моем рабочем примере:

    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();
Другие вопросы по тегам