перезагрузка базы данных firebase в реальном времени после завершения транзакций в for-l oop - PullRequest
0 голосов
/ 07 августа 2020

У меня есть следующий код.

for (var i = 0; i < array.length; i++) {
          let brand = array[i];
          // handle analytics
          database.ref("brands/" + brand).transaction(function (post) {
            if (post) {
              if (post.followers != null) {
                post.followers++;
              } else {
                post.followers = 1;
              }
            }
            return post;
          });
}

// once all is done, trigger a reload
// window.location.reload();

В основном я обрабатываю некоторую аналитику с транзакциями в for-l oop. Однако я хочу sh сделать window.location.reload после все транзакции завершены в for-l oop. (Я считаю, что если я инициирую перезагрузку сразу после for-l oop, все транзакции могут не быть завершены и будут прерваны перезагрузкой.)

Я не слишком уверен, как подойти это (с asyn c, await, цепочкой обещаний et c), поэтому мне интересно, какое самое прямое решение такой проблемы! Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Поскольку вы знаете, сколько транзакций вам нужно запустить (array.length), вы можете подсчитать, сколько транзакций было завершено, а затем перезагрузить окно после последней:

let doneCount = 0;
for (var i = 0; i < array.length; i++) {
  let brand = array[i];
  database.ref("brands/" + brand).transaction(function (post) {
    if (post) {
      if (post.followers != null) {
        post.followers++;
      } else {
        post.followers = 1;
      }
    }
    return post;
  }, function(error, committed, snapshot) {
    if (doneCount++ == array.length) {
      window.location.reload();
    }
  });
}

Также см. документация для runTransaction.

Но через несколько месяцев есть гораздо более простой способ сделать это: использовать оператор ServerValue.increment(). Фактически, с этим вы можете объединить весь l oop в один оператор обновления:

let updates = {};
for (var i = 0; i < array.length; i++) {
  let brand = array[i];
  updates[`brands/${brand}] = firebase.database.ServerValue.increment(1);
}
database.ref().update(updates);

Намного проще!

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