Это довольно странная вещь, и ее трудно воспроизвести. Не лучшее состояние сообщения об ошибке, прошу прощения.Пожарные операции возвращаются несколько раз намного позже?
Я использую .transaction(), чтобы записать значение в местоположение в Firebase. Вот некоторые псевдо-код:
var ref = firebase.child('/path/to/location');
var storeSafely = function(val) {
ref.transaction(
function updateFunc(currentData) {
console.log('Attempting update: ' + JSON.stringify(val));
if (currentData) return;
return val;
},
function onTransactionCompleteFunc(err, isCommitted, snap) {
if (err) {
console.log('Error in onTransactionCompleteFunc: ' + JSON.stringify(err));
return;
}
if (! isCommitted) {
console.log('Not committed');
return;
}
ref.onDisconnect().remove();
doSomeStuff();
});
};
var doSomeStuff = function() {
// Things get done, time passes.
console.log('Cleaning up');
ref.onDisconnect().cancel();
ref.set(
null,
function onSetCompleteFunc(err) {
if (err) {
console.log('Error in onSetCompleteFunc: ' + JSON.stringify(err));
}
});
};
storeSafely(1);
// later...
storeSafely(2);
// even later...
storeSafely(3);
Я эффективно использовать Firebase транзакции в качестве своего рода блокировки мьютекса:
магазин значение в месте с помощью транзакции.
Установите onDisconnect для определения местоположения, чтобы удалить значение, если мое приложение замирает во время работы.
Сделайте некоторые вещи.
Удалите onDisconnect для местоположения, потому что я покончил с этим.
Удалить значение по месту.
Я делаю это каждые несколько минут, и все это отлично работает. Вещи записываются и удаляются отлично, и журналы показывают, что я создаю блокировку, делаю вещи, а затем отпускаю блокировку.
Странная часть - это то, что происходит часов позже. Иногда Firebase имеет обслуживание, и мое приложение получает кучу разрешенных прав. В то же время это происходит, я вдруг начал получать кучу этого вывода в журналах:
Attempting update 1
Attempting update 2
Attempting update 3
... других словах, это выглядит, как сделки никогда полностью не завершены, и они пытаются повторить теперь, когда местоположение больше не читается. Это почти похоже на закрытие кода транзакции(), который никогда не завершался, и по какой-то причине он перепроизводится.
Я пропустил что-то действительно важное здесь о том, как закончить транзакцию?
(Примечание.. Я первоначально отправил это в Firebase группы Google, но в конце концов напомнил, что вопросы кода должны идти на Stack Overflow Извиняюсь за кросс-постинг)