Таймер на стороне клиента. Firebase+Angular
Делаю онлайн аукцион. Соответственно нужен таймер который по истечению времени изменит статус предмета не активный. С помощью web worker'а удалось это сделать. Проверяю конечную дату (которую беру с firestore) с текущей и если они совпадают то меняю статус.НО к сожалению работает это только по нажатию кнопки на странице которая и запускает webworker. Если меняю например на onload, то ngOnInit не успевает получить данные с firestore и соответственно не выполняется webworker. Есть ли способ который может помочь решить данную проблему?
Знаю что у firebase есть такая штука как function, но она к сожалению платная.
component.ts
ngOnInit(){
this.initializeWorker();
}
timeWorker(){
if(this.products.status==='active'){
this.worker.postMessage(this.products.closureDate);
this.worker.addEventListener('message', ({data})=>{
this.checkStatus(data);
})
}
}
initializeWorker(){
if (typeof Worker !== 'undefined') {
// Create a new
this.worker = new Worker(new URL('./random.worker', import.meta.url));
this.worker.postMessage('');
} else {
// Web workers are not supported in this environment.
// You should add a fallback so that your program still executes correctly.
}
}
worker.ts
addEventListener('message', ({ data }) => {
console.log("data:" + data);
const response = endUpAuc(data);
postMessage(response);
});
function endUpAuc(ps) {
console.log("ps: "+ps);
var cDate = new Date(ps);
console.log("cdate: "+cDate)
if(cDate.getTime()>new Date().getTime())
{
console.log(cDate.getTime());
console.log(new Date().getTime());
console.log("active");
return "active";
}
else if(cDate.getTime()<=new Date().getTime()){
console.log("inactive");
//this.updateStatus("inactive");
return "inactive";
//this.router.navigate(['/results'])
}
}
component.hml
<div class="about" onload="timeWorker()">
...
</div>