A transação do Firebase lê nulo no caminho, mesmo quando há dados nesse caminho

Dec 22 2020

Eu entendo que as transações do Firebase às vezes lêem os dados como nulos, mas o loop é executado novamente até que o valor seja obtido do servidor e confirmado. No entanto, estou enfrentando uma situação única em que a transação lê dados nulos e confirma o valor que eu retorno em caso de nulo. Por favor, dê uma olhada no código em anexo.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

No código acima, "deductTransaction" é o caminho dos dados (número) que desejo atualizar

O código acima funciona bem em alguns casos, isto é, o loop é executado novamente caso o nulo seja lido e às vezes ele apenas executa uma vez, lê o valor como nulo mesmo se houver alguns dados naquele caminho e então confirma 25, destruindo assim os dados originais

PS: Estou perto de puxar meu cabelo, então qualquer ajuda seria muito apreciada

Respostas

1 FrankvanPuffelen Dec 22 2020 at 20:48

Quando você executa uma transação em um local, o retorno de chamada / manipulador é imediatamente invocado com a estimativa atual do cliente do valor naquele local. Na maioria das vezes, essa estimativa inicial do valor atual será null.

Seu manipulador precisa lidar com essa situação. Então: digamos que não existam dados no local e você queira descontar o custo, o que aconteceria? Normalmente, você retornaria -25ou recomendaria o aborto da transação.

De qualquer maneira: a estimativa inicial e o novo valor serão enviados ao servidor de banco de dados, que detecta que a estimativa inicial estava errada e retorna o valor atual ao chamador. O SDK então invoca seu manipulador / retorno de chamada novamente, com a melhor estimativa (não esperançosamente correta) no valor atual.

Veja também:

  • O gerenciador de transações do banco de dados em tempo real do Firebase é chamado duas vezes na maioria das vezes (com um diagrama do fluxo acima)
  • Firebase runTransaction not working - MutableData is null
  • Compreender a resolução de conflitos no firebase
  • Por que currentData em minha transação do Firebase é sempre nulo?

Nota: hoje em dia você pode realizar operações de incremento e decremento sem uma transação usando o incrementoperador. Isso simplificará significativamente seu código e terá um desempenho melhor, conforme mostrado em Com que rapidez você pode incrementar atomicamente um valor no Firebase Realtime Database? .

Para comparação: o incrementoperador assume um valor atual de 0se nenhum valor existir no local.