Как я могу задержать наблюдаемое, только если оно возвращается быстрее, чем задержка
Взять, к примеру:
this.http.get('/getdata').pipe(delay(2000))
Я хотел бы, чтобы этот запрос занимал как минимум 2 секунды, но не дольше, чем требуется для выполнения запроса.
Другими словами:
если запрос занимает 1 с, я хочу, чтобы наблюдаемое завершилось за 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();