每當我在NodeJS中定義一個Firebase事務時,我發現它總是運行三次 - 前兩次使用空數據,最後第三次使用實際數據。這是正常的嗎?NodeJS中的Firebase事務始終運行3次?
例如下面的代碼:
firebaseOOO.child('ref').transaction(function(data) {
console.log(data);
return data;
});
輸出以下:
null
null
i1: { a1: true }
我本來期望它只能打印的最後一個項目。
要回答在評論一個問題,這裏是一個回調相同:
firebaseOOO.child('ref').transaction(function(data) {
console.log(data);
return data;
}, function(error, committed, snapshot) {
if (error)
console.log('failed');
else if (!committed)
console.log('aborted');
else
console.log('committed');
console.log('fin');
});
其產生以下的輸出:
null
null
i1: { a1: true }
committed
fin
我讀過的交易之前,是如何工作的細節張貼的問題,所以我曾嘗試設置applyLocally虛像這樣:
firebaseOOO.child('ref').transaction(function(data) {
console.log('hit');
return data;
}, function(){}, false);
但它仍然打3次(只是雙重檢查),所以我認爲這是不同的東西。在交易之前獲得'價值'會像預期的那樣「起作用」,因爲它只會觸及一次,而且不管侷限性是什麼,所以我不確定適用於什麼?這就是我所說的交易之前所獲得的價值是指:
firebaseOOO.child('ref').once('value', function(data) {
console.log('1');
firebaseOOO.child('ref').transaction(function(data) {
console.log('2');
return data;
});
});
輸出:
1
2
@邁克爾:一個人如何可以利用的這種行爲?事務主要用於讓數據本身用於自我修改 - 原型增量++方案。所以如果我需要給現有值10加1,並繼續使用11的結果,函數命中的前兩次我將得到我需要處理的錯誤結果1,最後得到正確的結果第三次打11。我怎樣才能使用這兩個最初的1?另一種情況(也許我不應該爲此使用事務,但如果它像我期望的那樣工作,它會使代碼變得更清晰)是如果值不存在,則插入一個值。如果事務只觸發一次,則空值意味着該值不存在,因此您可以在該情況下將計數器初始化爲1,否則將值加1。用嘈雜的零點,這是不可能的。
這似乎是從這一切的外賣是簡單地使用'一次'模式更經常?
ONCE交易模式:
firebaseOOO.child('ref').once('value', function(data) {
console.log('1');
firebaseOOO.child('ref').transaction(function(data) {
console.log('2');
return data;
});
});
這是一個很奇怪的交易用途。你爲什麼要把它設回到完全相同的值?如果你設置了第二個回調,它說什麼?提交成功了嗎?有錯誤嗎? – Kato 2013-04-20 13:43:11
嘿加藤,這是證明我的問題絕對最簡單的情況。我真正的代碼有更多的邏輯。沒有錯誤信息,結果在最後成功記錄。事實上,如預期的那樣,最終只有1個提交消息。我更新了我的問題以反映這些結果。 – Baz 2013-04-20 20:47:07