2016-09-30 6 views
0

У меня есть сервис, который называет мой API, как это:Угловое 2: Запуск HTTP вызов на интервале

return this._http 
     .post(apiUrl + 'Controller/Action', params, {withCredentials: true, headers: this.headers}) 
     .timeoutWith(8000, Observable.defer(() => Observable.throw(this._feedbackService.timeout()))) 
     .map((response: Response) => response.json().data); 

И я называю эту функцию из моего компонента, как это:

this._mySub = this._myService.getSomething() 
         .subscribe(
          response => this._listOfSomething = response, 
          error => this._loggerService.log(2, "warn", "Error bla bla") 
         ); 

Как я запустить этот HTTP-вызов на интервале?

Я попытался это:

this._mySub = this._myService.getSomething() 
         .interval(15000) 
         .startWith(0) 
         .subscribe(
          response => this._listOfSomething = response, 
          error => this._loggerService.log(2, "warn", "Error bla bla") 
         ); 

Но что говорит:

Свойство 'интервал' не существует на типа 'Observable < любой>'

я бы получил он работает следующим образом:

Observable.interval(15000).subscribe(() => { 
    this.refreshList(); 
}); 

refreshList() { 

this._mySub = this._myService.getSomething() 
         .subscribe(
          response => this._listOfSomething = response, 
          error => this._loggerService.log(2, "warn", "Error bla bla") 
         ); 

} 

Но это похоже на запуск HTTP-запроса в почти случайные времена, и ему нехорошо настраивать его таким образом.

ответ

0

Вы можете попробовать что-то вроде этого:

let intervalId = setInterval(() => { 
    this.updateData(); 
}, 15000); 

updateData(){ 
    this._mySub = this._myService.getSomething() 
          .subscribe(
           response => this._listOfSomething = response, 
           error => this._loggerService.log(2, "warn", "Error bla bla") 
         ); 
} 

Хорошая практика не очистить интервал, когда не требуется. Вы должны поместить свой интервал в ngOnInit() и очистить его в ngOnDestroy(). Потому что, если вы поместите его в конструктор, он будет продолжать обновление, даже если вы переключите компоненты (перейдите на другую подстраницу на веб-сайте).

EDIT. Вы можете очистить интервал, используя clearInterval(intervalId).

+0

Это действительно работает. Спасибо. Единственным недостатком является то, что я должен вручную вызвать 'this.updateData()' перед настройкой интервала вместо того, чтобы использовать что-то более необычное, как 'startWith (0)' вещь. –

Смежные вопросы