A transação do Firebase lê nulo no caminho, mesmo quando há dados nesse caminho
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
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 -25
ou 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 increment
operador. 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 increment
operador assume um valor atual de 0
se nenhum valor existir no local.