これはかなり奇妙なことであり、再現するのは難しいです。バグ報告の最善の状態ではない、私はお詫び申し上げます。Firebaseトランザクションは何度も何度も戻ってきますか?
Firebaseの場所に値を書き込むために.transaction()を使用しています。ここではいくつかの擬似コードは次のとおりです。
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
...つまり、それが完全に完了しません取引のように見える、と彼らは再試行しようとしていますこれ以上場所を読み取ることができなくなりました。これは決して完了しなかったtransaction()コードのクロージャーとほぼ同じです。何らかの理由で今すぐ再実行されています。
トランザクションを終了する方法についてここで本当に重要なことがありませんか?
(注意:私はもともとFirebase Googleグループへの投稿ですが、最終的にそのコードの質問はスタックオーバーフローに行くことになっている思い出した私は、クロスポストをお詫び申し上げます)