Я пытаюсь внедрить счетчик для оплаты. Прямо сейчас я тестирую его на отмененном состоянии PayPal вместо фактической покупки, потому что на данный момент у меня нет учетных данных. Как только я это сделаю, я перенесу большую часть этого кода в функцию фактического успешного платежа.
Есть ли способ обновить поле int документа firebase, увеличив его существующее поле int?
Код, который у меня здесь, входит в бесконечный цикл, поскольку он отслеживает свои собственные данные.
paymentCancelled: function(data) {
console.info("payment cancelled")
let db = firebase.firestore()
db.collection("users").where("userId", "= = ", firebase.auth().currentUser.uid)
.onSnapshot(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.info("before: " + doc.data().credits)
//this is where I'm having trouble
const creditIncrement = doc.data().credits + 100
var creditRef =
db.collection("users").doc(firebase.auth().currentUser.uid);
return creditRef.update({
credits: creditIncrement
})
.then(function() {
console.info("Document successfully updated!");
return;
})
.catch(function(error) {
// The document probably doesn't exist.
console.error("Error updating document: ", error);
});
})
})
console.info(data) //logging out contents from PayPal, unnecessary atm
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны использовать .get() вместо . onSnapshot()
db.collection("users").where("userId", "= = ", firebase.auth().currentUser.uid)
.get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.info("before: " + doc.data().credits)
//this is where I'm having trouble
const creditIncrement = doc.data().credits + 100
var creditRef =
db.collection("users").doc(firebase.auth().currentUser.uid);
return creditRef.update({
credits: creditIncrement
})
.then(function() {
console.info("Document successfully updated!");
return;
})
.catch(function(error) {
// The document probably doesn't exist.
console.error("Error updating document: ", error);
});
})
})
.get() получает данные только один раз, вместо того, чтобы слушать изменение данных с помощью onSnapshot
Для согласованности данных вы можете рассмотреть возможность использования пожарная сделка
Неважно, что это определенно была ошибка, ха-ха. Ваше здоровье!