Нажав кнопку, пользователь создает новый «operation
» в качестве документа в Google Firestore.Содержит поле с меткой времени пожарного магазина в x минутах в будущем.Будет создан новый объект обратного отсчета, в котором хранятся текущий тип operation
и секунды.
Этот объект Countdown
должен быть доступен для нескольких угловых компонентов.
Всякий раз, когда countdown
достигает <0, запускаются две асинхронные задачи, которые обновляют документ пользователя <code>oeprationId и устанавливают операцию завершенной.
Огромная проблема заключается в том, что всякий раз, когда я обновляю страницу во время обратного отсчета, этот счетчик никогда не достигаети, следовательно, операция никогда не завершается.
Я подумал, что мне нужно будет перебрать все операции, проверить незавершенные операции с идентификатором пользователя и начать обратный отсчет во время onInit.Во время onInit я подписываюсь на сбор операций и выполняю итерации.Если критерий встречается, я превращаю найденную операцию в наблюдаемую и подписываюсь на нее.Вот где он перестает работать.
Я был бы рад, если бы вы дали мне какие-либо рекомендации, помощь, код или оптимизацию для моего кода, потому что я чувствую себя немного грязным из-за того, как я обращаюсь с подписками и наблюдаемыми.Если вам понадобится больше кода, дайте мне знать.
Я уже пытался напрямую получить наблюдаемое из firestore с предложениями where вместо фильтрации на внешнем интерфейсе, что не сработало.
public startCountdown(s: number, currentOperation: Operation) {
if (this.countdown === null) {
this.countdown = new Countdown();
this.countdown.operationid = currentOperation.operationid;
this.countdown.name = currentOperation.type;
this.countdown.progress = 0;
console.log('started Countdown..', s);
this.countdown.progressPerSecond = 100 / s;
let counter = s;
let minutesString: string;
let secondsString: string;
this.countdown.interval = setInterval(() => {
this.countdown.progress = this.countdown.progress + this.countdown.progressPerSecond;
//Some time calc
counter--;
if (counter < 0) {
clearInterval(this.countdown.interval);
const fulfill = this.fulfillOperation();
fulfill.catch((err) => {
console.log(err);
}).then((value => console.log('fulfilled', value)));
const update = this.updateOwnOperation('');
update.catch((err) => {
console.log(err);
});
this.countdown = null;
}
}, 1000);
}
//Iterating over all Operations..
this.operations$.subscribe((operations) => {
operations.forEach((operation) => {
if (operation.attacker === this.auth.cultid) {
if (!operation.done) {
this.currentOperation$ = of(operation);
}
}
});
});
//Start countdown if there is a current operation..
if (this.currentOperation$ !== null) {
this.currentOperation$.subscribe((operation) => {
const timestampMillis = operation.timestamp.toMillis();
const nowMillis = firebase.firestore.Timestamp.now().toMillis();
const effectiveTimeSeconds = (timestampMillis - nowMillis) / 1000;
this.auth.startCountdown(effectiveTimeSeconds, operation);
});
}
Ожидаемое поведение должно состоять в том, что всякий раз, когда страница обновляется, обратный отсчет переоценивается и проверяет, находится ли временная метка ниже текущего времени, чтобы запустить две описанные асинхронные задачи.