Вы не должны использовать метод set()
в своей транзакции, как представлено в doc :
Примечание: изменение данных с помощью set () отменит все отложенные транзакциив этом месте, поэтому следует соблюдать особую осторожность, если смешивать set () и транзакцию () для обновления одних и тех же данных.
Вы должны "передать transaction()
функцию обновления, которая используется для преобразованиятекущее значение в новое значение. "
Таким образом, обычно должно работать следующее:
busesRef.transaction(function(currentValue) {
if (currentValue === null) {
let newRow = JSON.stringify({ number: num, status: "reserved", timestamp: Date.now() });
return newRow; // <- Here the function returns the new value
} else {
console.log('Value Already Exists');
return; // Will abort the transaction.
}
},
....
Наконец, я думаю, что вам не нужно структурировать ваш объект.Выполнение следующих действий должно работать:
let newRow = { number: num, status: "reserved", timestamp: Date.now() };
return newRow;
или, конечно, просто
return { number: num, status: "reserved", timestamp: Date.now() };
Еще одно соображение:
IВы заметили, что вы заключаете транзакции в цикл for
, что означает, что вы будете изменять значения различных узлов busesRef
.Разве вы не должны делать все эти изменения в одной транзакции?И не с набором «атомарных» транзакций, каждая из которых изменяет значение данного busesRef
узла?Это зависит от вашего конкретного случая использования.