Обработка обратного отсчета с помощью Angular Firestore - PullRequest
0 голосов
/ 29 марта 2019

Нажав кнопку, пользователь создает новый «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);
  });
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...