Угловой 5 HTTP-запрос с интервалами, используя Observables, в то время как значение может измениться - PullRequest
0 голосов
/ 06 мая 2018

как я могу реализовать это правильно, чтобы он подписывался только на последнее заданное значение? - он работал нормально для меня, используя простой setInterval, но я хочу переключиться на Observables, чтобы лучше понять это.

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

Это компонент, в котором я вызываю данные (cityName может постоянно меняться в зависимости от ввода пользователя и, следовательно, изменять запрос, выполняемый http

submitData2(cityName) {
Observable.timer(0, 10000)
.takeWhile(() => this.alive) // only fires when component is alive
.subscribe(() => {

  this._weatherService.getWeather(cityName)
  .subscribe(weathers => {
     this.weathers = weathers;

    console.log(weathers);
    this.currentImg();
  },
     err => {console.log(err)},
     () => {console.log('end')}

);

});
 }

Это услуга, которая делает запрос в зависимости от названия города:

  getWeather(city): Observable<any[]> {
return this.http.get('weather/getCity/' + city)
  .map(res => res.json())     ;
}

1 Ответ

0 голосов
/ 06 мая 2018
sub;
submitData2(cityName) {
if (sub) sub.unsubscribe();

sub =
   Observable.timer(0, 10000)
    .takeWhile(() => this.alive) // only fires when component is alive
    .switchMap(() => this._weatherService.getWeather(cityName))
    .subscribe(weathers => {
       this.weathers = weathers;
      console.log(weathers);
      this.currentImg();
    },
    err => {console.log(err)},
    () => {console.log('end')};
 }

это будет работать, но вам нужно сохранить подписку вне вызова функции, чтобы вы могли очистить ее при повторном вызове. Если вы не хотите, чтобы он был очищен, и хотите сохранить все вызовы до завершения takeWhile, вы можете удалить этот код.

...