Этот код не будет работать:
seatsCountRef.transaction((current)=>{
if ((current || 0) >= 1) {
return (current || 0) - 1;
}
})
Помните, что я показал в вашем первом вопросе об этом куске кода :
..пока ваша запись не будет выполнена успешно без конфликта или вы прервете транзакцию, не вернув значение из функции обновления.
Теперь посмотрите на ваш код, зная, что при первом запускеВероятно, Firebase передает null
в качестве текущего значения:
if ((current || 0) >= 1) {
return (current || 0) - 1;
}
Если current
равно null
, это превращается в:
if ((null || 0) >= 1) {
return (null || 0) - 1;
}
Что превращается в:
if (0 >= 1) {
return 0 - 1;
}
И поскольку 0 >= 1
, если false
, вы не возвращаете значение и, таким образом, прерываете транзакцию.
Вам нужно будет обработать этот начальный null
.Даже когда ваш вариант использования говорит, что невозможно, чтобы значение даже не существовало, ваш код все равно должен будет обработать его, поскольку Firebase SDK может передать вам null
в рамках своей операции.
Так какnull
не может существовать в вашей базе данных, не имеет значения что вы вернете в этом случае.Все, что имеет значение, это то, что вы возвращаете что-то , чтобы убедиться, что транзакция не прервана.Например, это будет работать:
seatsCountRef.transaction((current)=>{
if ((current || 0) >= 1) {
return (current || 0) - 1;
}
return "This will never be stored";
})
Но так как это значение никогда не будет сохранено, вы также можете просто возвратить -1
, который приведет к простейшему коду:
seatsCountRef.transaction((current)=>{
return (current || 0) - 1;
})
Если вы обеспокоены тем, что это недопустимое значение когда-либо сохраняется, вы можете отловить это в правилах безопасности и отклонить его:
"seatsCount": {
".validate": "newData.isNumber() && newData.val() >== 0"
}
Это на самом деле довольно хорошая практика в целом: один разВаша модель данных стабилизируется, используйте правила проверки для обеспечения ее соблюдения.Здесь это не будет иметь значения, так как вы уже говорите, что seatsCount
должно существовать.Но на случай, если этого не произойдет, это правило безопасности перехватит выходные данные транзакции.