2016-07-11 7 views
3

Ein paar Monate zurück Firebase implementiert promises in the database.So verketten Sie mehrere Versprechen in einer einzigen Transaktion in Firebase

In dieser Blog-Post gibt es ein Beispiel eine einzelne Transaktion mit dem Versprechen mit:

var article; 
var articleRef = ref.child('blogposts').child(id); 
articleRef.once('value').then(function(snapshot) { 
    article = snapshot.val(); 
    return articleRef.child('readCount').transaction(function(current) { 
    return (current || 0) + 1; 
    }); 
}).then(function(readCountTxn) { 
    renderBlog({ 
    article: article, 
    readCount: readCountTxn.snapshot.val() 
    }); 
}, function(error) { 
    console.error(error); 
}); 

Ist es möglich, Kette mehr Versprechen in eine einzige Transaktion Daten in der Lage sein nur zu löschen, wenn alles gelöscht werden kann ?

Antwort

4

Benötigen Sie eigentlich eine Transaktion oder nur eine atomare Operation? Sie können atomare Operationen auf mehreren Wegen ausführen gleichzeitig das wird fehlschlagen, wenn etwas mit einem von ihnen schief geht (dh löschen, die eine Schreiboperation ist):

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 

var updatedUserData = {}; 
updatedUserData["user/posts/location1"] = null; 
updatedUserData["user/blogs/location2"] = null; 
// Do a deep-path update 
ref.update(updatedUserData).then(function() { 
    //yay 
}, function(error) { 
    console.log("Error updating data:", error); 
}); 

Transaktionen auf der anderen Seite werden in der Regel für die Atomdaten Änderungen, bei denen gleichzeitige Aktualisierungen zu einem inkonsistenten Datenzustand führen können. Stellen Sie sich eine upvote Zähler:

// user 1 
upvotesRef.transaction(function (current_value) { 
    return (current_value || 0) + 1; 
}); 
// user 2 
upvotesRef.transaction(function (current_value) { 
    return (current_value || 0) + 1; 
}); 

// upvotesRef will eventually be consistent with value += 2 

Ohne Transaktionen, Sie werden diese Konsistenz nicht garantiert:

// user 1 
ref.on("value", function(snapshot) { 
    console.log(snapshot.val()); // oops, could be the same value as user 2! 
    ref.set(snapshot.val() + 1); 
}); 
// user 2 
ref.on("value", function(snapshot) { 
    console.log(snapshot.val()); // oops, could be the same value as user 1! 
    ref.set(snapshot.val() + 1); 
}); 

Mehr Infos here

+0

Oh, das ist klug, ich habe nicht Sie könnte auch „Löschen“, dass Weg. – Pier

+1

Heute habe ich gelernt, dass Pier nicht alle meine Antworten liest. :-( http://stackoverflow.com/questions/38084531/firebase-bulk-delete-child-nodes/38084832#38084832 ;-) –

+0

Große Antwort BTW Tommy. Nicht einfach die Frage beantworten, sondern den Anwendungsfall viel einfacher lösen. Nett! –