Промежуточное состояние при использовании транзакции базы данных Firebase в реальном времени - PullRequest
0 голосов
/ 05 октября 2018

Мой вопрос о том, что происходит в транзакции базы данных Firebase в реальном времени.Допустим, у меня есть код, похожий на этот в облачной функции.Экспортируемая функция вызывается по запросу http.Хорошо, я знаю, что updateBalance() должен быть вызван после возвращения обещания, но это не главное.Я хочу знать, почему, если бы я выполнил этот код с балансом 25,00, возвращаемое значение путем вызова ref.once () в hasMoneyInTheBank () составляет -0,02, а не 25,00 или 24,98.

Я знаю, что в итоге все обновляется, и окончательное значение составляет 24,98.Это потому, что я читаю данные из того же соединения?

Что если какой-то другой процесс будет читать эти же данные в это время?

function updateBalance(id, amount){
  const db  = database();
  const currentBalance = db.ref(`${id}/balance`);
  currentBalance.transaction(currentValue =>(currentValue*100 - amount*100)/100 );
}

function hasMoneyInTheBank(id,amount){
  const db = database();
  const ref = db.ref(`${id}/balance`);
  ref.once('value',snap => {
    console.log(`This is the balance:${snap.val()}`);
    if(snap.val() > amount){
      return true;
    }else{
      return false;
    }
  })
  .catch(error=> console.log(error));
}

export function doSomeAction(id, description){

  const db = database();
  const ref = db.ref(`${id}/logs/log_something`);

  const data = {timestamp:database.ServerValue.TIMESTAMP, description:description};

  ref.push();

  console.log(hasMoneyInTheBank is: ${hasMoneyInTheBank(id,5.00)}`);
  updateBalance(id,0.02);

};
...