Yazma işlemlerinin işlemlere benzer şekilde çalışması için bir güncelleştirme sayacı kullanabilirsiniz. (Aşağıda bazı sahte kodları kullanacağım; bunun için üzgünüm ama örnek için tam bir REST API'si yazmak istemedim.)
Örneğin, böyle bir neslim varsa:
{
total: 100,
update_counter: 0
}
Ve böyle bir yazma kuralı:
{
".write": "newData.hasChild('update_counter')",
"update_counter": {
".validate": "newData.val() === data.val()+1"
}
}
şimdi sadece her operasyonla update_counter ileterek eşzamanlı değişiklikler önleyebilir.
var url = 'https://<INSTANCE>.firebaseio.com/path/to/data.json';
addToTotal(url, 25, function(data) {
console.log('new total is '+data.total);
});
function addToTotal(url, amount, next) {
getCurrentValue(url, function(in) {
var data = { total: in.total+amount, update_counter: in.update_counter+1 };
setCurrentValue(ref, data, next, addToTotal.bind(null, ref, amount, next));
});
}
function getCurrentValue(url, next) {
// var data = (results of GET request to the URL)
next(data);
}
function setCurrentValue(url, data, next, retryMethod) {
// set the data with a PUT request to the URL
// if the PUT fails with 403 (permission denied) then
// we assume there was a concurrent edit and we need
// to try our pseudo-transaction again
// we have to make some assumptions that permission_denied does not
// occur for any other reasons, so we might want some extra checking, fallbacks,
// or a max number of retries here
// var statusCode = (server's response code to PUT request)
if(statusCode === 403) {
retryMethod();
}
else {
next(data);
}
}
Merhaba Martin, bu çalışmayı nasıl öngörüyorsunuz? İşlemlerin, istemcinin verileri ayarlama girişiminde bulunduğunu, sunucunun eşzamanlı değişiklikler ile yanıt vermeyi sürdürdüğü ve sonuçta bir değere ya da pes etmeyi sürdürdüğü bir geri-tartışmaya dayandığını unutmayın. – Kato
Merhaba Kato, kesinlikle aynı tartışma sunucusu tarafını uygulamaya çalışıyorum. Bir nesnenin mevcut durumunu GET isteği ile firebase içinde alabilir ve daha sonra PUT ile değiştirebilirim, ancak bu nesnenin değiştirilip değiştirilmediğini bilmek için bir yol var mı? –
Sanmıyorum; REST ile işlem denemenin bir parçası olan budur. Sanırım, işlemleri kolayca simüle eden bir çözüm oluşturabiliriz. Bir cevap vereyim. – Kato