Sie könnten einen Aktualisierungszähler verwenden, um Schreiboperationen ähnlich wie Transaktionen auszuführen. (Ich werde unten einen Pseudo-Code verwenden; tut mir leid, aber ich wollte kein vollständiges REST-API für ein Beispiel schreiben.)
Zum Beispiel, wenn ich ein Objekt wie dieses habe:
{
total: 100,
update_counter: 0
}
und eine Schreibregel wie folgt aus:
{
".write": "newData.hasChild('update_counter')",
"update_counter": {
".validate": "newData.val() === data.val()+1"
}
}
ich jetzt gleichzeitige Änderungen bei jedem Vorgang durch einfaches Durchleiten im update_counter verhindern könnte. Zum Beispiel:
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);
}
}
Hallo Martin, wie stellst du dir das vor? Denken Sie daran, dass diese Transaktionen auf einer Hin-und-her-Diskussion beruhen, bei der der Client versucht, die Daten zu setzen, der Server antwortet immer wieder mit gleichzeitigen Änderungen, und sie legen schließlich einen Wert fest oder geben auf. – Kato
Hallo Kato, sicher, ich versuche, genau die gleiche Diskussion Server-Seite zu implementieren. Ich kann den aktuellen Status eines Objekts innerhalb der Firebase über die GET-Anforderung abrufen und dann über PUT ändern, aber gibt es eine Möglichkeit für mich zu wissen, ob dieses Objekt inzwischen geändert wurde? –
Ich glaube nicht; Das ist Teil der Probleme mit dem Versuch, Transaktionen über REST zu versuchen. Ich nehme an, wir könnten eine Lösung zusammenstellen, die Transaktionen einfach genug simuliert. Lass mich eine Antwort geben. – Kato