Отложенный HTTP-запрос в Angular

Мне любопытно. Я просто попытался отложить HTTP-запрос в Angular (6.x) с помощью .pipe( delay( 5000 ) )..., но похоже, что RxJS просто задерживает окончательный ответ, а не вызов сервера. Но мне действительно нужно отложить настоящий вызов сервера. Это не было проблемой в AngularJS через HttpInterceptor, но я не могу заставить его работать. Любые идеи?

Спасибо заранее.

Обновлять:

Я уже пробовал HttpInterceptor, но это тоже не работает. У меня есть CustomHttpClient, который помещает URL-адреса запущенных запросов в массив и удаляет их после завершения. Некоторые запросы не могут выполняться параллельно, поэтому я должен проверить список ожидающих вызовов, например, от / api / somePath. Если такой URL есть в списке, текущий запрос должен быть отложен. Прекрасно работает в HttpInterceptor AngularJS.


person Marsch    schedule 18.07.2018    source источник
comment
windows.setTimeout (() = ›{/ * Ваш код задержки * /}, 5000)   -  person wrivas    schedule 18.07.2018
comment
Почему вы хотите отложить http-вызов ??   -  person Deepender Sharma    schedule 18.07.2018
comment
@DeependerSharma, вероятно, чтобы избежать ограничений скорости   -  person Moshe    schedule 18.07.2018


Ответы (5)


Мне нравятся эти перехватчики, потому что с ними можно творить много волшебства.

Обработка ОТВЕТА на HTTP-вызов в перехватчике

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      tap(response=> console.log(response) )  // <== or do some other magic
    );
  }
}

Обработайте ЗАПРОС HTTP-вызова в перехватчике, например, отложив его.

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return timer(2000).pipe(         // <== Wait 2 Seconds
      switchMap( ()=> next.handle(request) )   // <== Switch to the Http Stream
    )
  }
}

в обоих случаях это один и тот же метод "intercept (...)", но разная обработка "next.handle ()".

теплые пожелания

person JanRecker    schedule 18.07.2018
comment
отлично смотрится это решение ???? - person C Alonso C Ortega; 30.05.2021

Если вы хотите отложить сам вызов с помощью RxJS, вы можете использовать timer:

timer(5000)
  .pipe(
    concatMap(() => of(42)),
  )
  .subscribe(...)
person martin    schedule 18.07.2018
comment
Вам не нужно take(1), timer(5000) испускает один раз и разрешает. - person Roberto Zvjerković; 18.07.2018

Что ж, вы можете снова использовать HttpInterceptor из @angular/common/http для этого.

Или просто:

Observable.timer(5000).pipe(tap( // do your stuff ))

person Roberto Zvjerković    schedule 18.07.2018
comment
Я уже пробовал HttpInterceptor, но он тоже не работает. У меня есть CustomHttpClient, который помещает URL-адреса запущенных запросов в массив и удаляет их после завершения. Некоторые запросы не могут выполняться параллельно, поэтому я должен проверить список ожидающих вызовов, например, от /api/somePath. Если такой URL есть в списке, текущий запрос должен быть отложен. - person Marsch; 18.07.2018

Начните с другого наблюдаемого (в данном случае наблюдаемого по таймеру) и переключитесь на наблюдаемый http-клиент:

timer(1000).pipe(
 switchMap(() => this.http.get('')),
)
.subscribe();

or

of(null).pipe(
 delay(1000),
 switchMap(() => this.http.get('')),
)
.subscribe();
person jcroll    schedule 18.07.2018

Вы можете использовать RxJS Observable.timer

let myRequest = this.http.get(...);
let pollingSubscription = myRequest
 .expand(() => Observable.timer(5000).flatMap(() => myRequest))
 .subscribe();
person Moshe    schedule 18.07.2018