Я пытаюсь реализовать следующее поведение в RxJS:
- Пожар события
- Вызов http API
- Когда API возвращается, либо:
- Подождите, пока не пройдет X миллисекунд с момента запуска события
- Немедленно возвращайтесь, если X миллисекунды уже прошли с момента запуска события
Это очень полезно для UX, потому что даже если вызов занимает 1 мс, я бы хотел показать значок загрузки не менее 100 мс.
Я не нашел способа реализовать это либо с delay
, throttle
, debounce
, либо с его вариантами.
this.eventThatFires
.switchMap(data => {
let startTime = Date.now();
return this.callHttpService(data)
.delay(new Date(startTime + 1000));
})
Я предположил, что что-то вроде этого сработало, но использование абсолютной даты, похоже, делает разницу во времени с текущим временем и не назначает задержку для этого абсолютного времени.
EDIT:
Кажется, нет встроенного оператора, который работает как то, что я описываю. Я просто создал его, потому что я буду использовать его во всем приложении:
import { Observable } from "rxjs/Observable";
function delayAtLeast<T>(this: Observable<T>, delay: number): Observable<T> {
return Observable.combineLatest(
Observable.timer(delay),
this)
.map(([_, i]) => i);
}
Observable.prototype.delayAtLeast = delayAtLeast;
declare module "rxjs/Observable" {
interface Observable<T> {
delayAtLeast: typeof delayAtLeast;
}
}