как вызвать мой сервис в angular с помощью setInterval

#javascript #angular #setinterval

#javascript #angular #setinterval

Вопрос:

У меня есть сервис, который получает, возвращает некоторые данные при загрузке страницы,

 getAllTurbinesStat(){
  return this.http.get(this.url_stat_Turbines_all);
}
  

в моем компоненте я использую этот сервис:

 this.service.getAllTurbinesStat().subscribe( s => {
   this.allStats.push(s);
});
  

allStat — это массив, теперь каждые 3 минуты эта функция должна запускаться для обновления данных, должен ли setInterval быть в службе или в моем компоненте? И как я должен это написать? Потому что в первый раз мне не нужен setinterval, потому что после первой загрузки страницы мои данные обновляются.

Ответ №1:

Вы можете попробовать это.

Сначала создайте в своем компоненте одну функцию, подобную этой.

 getAllTurbinesStat() {
  this.service.getAllTurbinesStat().subscribe(s => {
    this.allStats.push(s);
  });
}
  

А затем из ngOnInit() или из constructor вашего компонента используйте это.

 this.getAllTurbinesStat();
setInterval(() => this.getAllTurbinesStat(), 180000);
  

Комментарии:

1. Я как раз собирался опубликовать точно такое же решение. «Хитрость» заключается в том, чтобы просто вызвать его один раз перед созданием интервала.

2. Кроме того, OP хотел вызвать функцию после 3minutes . Чего 180000ms нет 30000ms 🙂

3. getAllTurbinesStat() внутри setinterval в ngOnInit выдает эту ошибку :

4. Никакая перегрузка не соответствует этому вызову. Перегрузка 1 из 2, ‘(обратный вызов: (… аргументы: любые []) => void, ms: число, … аргументы: любые []): тайм-аут’, выдала следующую ошибку. Аргумент типа ‘void’ нельзя присвоить параметру типа ‘(…args: any[]) => void’. Перегрузка 2 из 2, ‘(обработчик: TimerHandler, timeout?: number, … аргументы: any[]): number’, выдала следующую ошибку. Аргумент типа ‘void’ нельзя присвоить параметру типа ‘TimerHandler’.ts(2769)

5. попробуйте это: setInterval(() => this.getAllTurbinesStat(), 180000);

Ответ №2:

Для этого вы можете использовать интервал, как показано ниже:

в вашем сервисе

  getAllTurbinesStat(){
  return this.http.get(this.url_stat_Turbines_all);
 }

 getData(): {
   return interval(3000).pipe(
      switchMap( () => this.getAllTurbinesStat())
   )

 }

  

в вашем компоненте

 this.service.getData().subscribe( s => {
   this.allStats.push(s);
});
  

Комментарии:

1. в моем компоненте вы вызываете getData (), для правильного запуска которого требуется 3000msc? я хочу, чтобы сначала он запускался при загрузке страницы, а не после 3000msc

2. интервал будет генерировать событие каждые 3 минуты, это событие будет вызывать `this.getAllTurbinesStat()« и вы будете получать новые данные каждые три минуты в вашем компоненте

Ответ №3:

Вы можете использовать таймер из rxjs.

 import { timer } from 'rxjs';
​
/*
  timer takes a second argument, how often to emit subsequent values
  in this case we will emit first value after 0 second and subsequent
  values every 3 minutes after
*/
const source = timer(0, 180000);
//output: 0,1,2,3,4,5......
const subscribe = source.subscribe(val => console.log(val));
  

Для вашего случая.

   return timer(0, 180000).pipe(
      flatMap( () => this.getAllTurbinesStat())
   )
  

Ответ №4:

Сначала вызовите свою функцию один раз в ngOnInit вашем компоненте, а затем продолжайте setInterval .

 ngOnInit() {
   getAllTurbinesStat();
   setInterval(getAllTurbinesStat(), 3000);
}

getAllTurbinesStat() {
  return this.http.get(this.url_stat_Turbines_all);
}