#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);
}