Транзакция Firebase считывает значение null на пути, даже если на этом пути есть данные
Я понимаю, что транзакции firebase иногда считывают данные как нулевые, но затем цикл запускается снова, пока значение не будет получено с сервера и зафиксировано. Однако я столкнулся с уникальной ситуацией, когда транзакция считывает нулевые данные и фиксирует значение, которое я возвращаю в случае нулевого значения. Пожалуйста, посмотрите прикрепленный код.
deductTransaction.transaction((current_value) => {
if (current_value != null) {
return current_value - cost;
}
return 25;
});
В приведенном выше коде deductTransaction - это путь к данным (числу), которые я хочу обновить.
Приведенный выше код в некоторых случаях работает нормально, т.е. цикл запускается снова в случае чтения null, а иногда он запускается только один раз, считывает значение как null, даже если на этом пути были какие-то данные, а затем фиксирует 25, тем самым уничтожая исходные данные
PS: Я близок к тому, чтобы выдернуть волосы, поэтому любая помощь будет очень признательна
Ответы
Когда вы запускаете транзакцию в каком-либо месте, немедленно вызывается обратный вызов / обработчик с текущим предположением клиента о значении в этом месте. Чаще всего это первоначальное предположение о текущем значении null
.
Ваш обработчик должен справиться с этой ситуацией. Итак: предположим, что в этом месте нет данных, и вы хотите вычесть стоимость, что произойдет? Обычно вы либо возвращаетесь, -25
либо приказываете транзакции прерваться.
В любом случае: первоначальное предположение и новое значение будут отправлены на сервер базы данных, который затем обнаружит, что первоначальное предположение было неверным, и вернет текущее значение вызывающей стороне. Затем SDK снова вызывает ваш обработчик / обратный вызов с (нет, надеюсь, правильным) наилучшим предположением для текущего значения.
Также см:
- Обработчик транзакций базы данных Firebase в реальном времени вызывается дважды большую часть времени (со схемой вышеуказанного потока)
- Firebase runTransaction не работает - MutableData имеет значение null
- Понимание разрешения конфликтов в firebase
- Почему currentData в моей транзакции Firebase всегда равен нулю?
Примечание: в настоящее время вы можете выполнять операции увеличения и уменьшения без транзакции, используя increment
оператор. Это значительно упростит ваш код и будет работать лучше, как показано в разделе Как быстро вы можете атомарно увеличить значение в базе данных Firebase Realtime? .
Для сравнения: increment
оператор принимает текущее значение, 0
если в данном месте нет значения.